线程1:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)在委托变量中获取nil

问题描述 投票:-3回答:1

我正在创建一个座位布局,并希望使用委托以数组的形式从视图控制器类中获取坐标,但是在传递坐标并获得此错误时,我从视图控制器获取nil。

这是我的视图控制器

import UIKit

class BookViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UITableViewDelegate, UITableViewDataSource, SeatMapDelegate {
    @IBOutlet weak var dropButton: UIButton!
    @IBOutlet weak var dropDownOutlet: UITableView!
    @IBOutlet weak var seatMapCollection: UICollectionView!
    @IBOutlet weak var dateSelecterCollection: UICollectionView!
    @IBOutlet weak var timeSelecterCollection: UICollectionView!

    var selectedIndexPath: IndexPath!
    var dateValue = ["1","2","3","4","10","6","7","8","9","5"]
    var dayValue = ["Mon","Tue","Wed","Thu","Thu","Thu","Thu","Thu","Thu","Thu"]
    var month = ["jan","feb","mar","apr","Thu","Thu","Thu","Thu","Thu","Thu"]
    var venue = ["Smart Cinemaz, Rupnagar","Smart Cinemaz, Fatehgarh Sahib "]
    var numberSection:Int = 10
    var numberOfItems:Int = 15
    var seatNumber = [Int]()
    var columns = [[Int]]()
    var rows = [[Int]]()
    var col = [2,3]
    var rowno = [8,9,16]
    var col1 = [5,6,7,8,9,11,12]
    var rowno1 = [9]
    var sectionHeader: Array<Int> = [0,4,10]
    var sectionHeading = ["Gold (₹180.00)","Silver (₹150.00)","Bronze (₹100.00)"]
    var rowValue = ["A","B","C","D","E","F","G","H","I","J"]
    var kCounter: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        self.seatMapCollection.dataSource = self
        self.seatMapCollection.delegate = self
        self.seatMapCollection.reloadData()
        self.seatMapCollection.maximumZoomScale = 2
        self.seatMapCollection.minimumZoomScale = 0.50
        self.view.sendSubview(toBack: seatMapCollection)
        seatMapCollection.register(UINib(nibName: "HeaderMulticolumn", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "Header")
        for seat in 0...numberOfItems-1{
            seatNumber.append(seat + 1)
        }

        self.dateSelecterCollection.dataSource = self
        self.dateSelecterCollection.delegate = self

        self.timeSelecterCollection.dataSource = self
        self.timeSelecterCollection.delegate = self
        self.dropDownOutlet.delegate = self
        self.dropDownOutlet.dataSource = self
        dropButton.contentHorizontalAlignment = .left

        /* let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:)))
         seatMapCollection.addGestureRecognizer(pinchGesture)*/

        columns.append(col)
        columns.append(col1)
        rows.append(rowno)
        rows.append(rowno1)
    }

    @IBAction func dropDown(_ sender: Any) {
        self.view.bringSubview(toFront: dropDownOutlet)
        if dropDownOutlet.isHidden == true{
            dropDownOutlet.isHidden = false
        }else {
            dropDownOutlet.isHidden = true
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if collectionView.tag == 1{
            return 1
        }else if collectionView.tag == 2{
            return 1
        }else{
            return 15 + 2
        }
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        if collectionView.tag == 1{
            return 7
        }else if collectionView.tag == 2{
            return 5
        }
        else{
            return 10 + 3
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView.tag == 1 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DateSelecterCollectionViewCell", for: indexPath) as! DateSelecterCollectionViewCell
            if (self.selectedIndexPath != nil && indexPath == self.selectedIndexPath){
                cell.backgroundColor = UIColor.yellow
                cell.dateOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.monthOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.dayOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
            }
            else{
                cell.backgroundColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.dateOutlet.textColor = UIColor.white
                cell.monthOutlet.textColor = UIColor.white
                cell.dayOutlet.textColor = UIColor.white
            }
            return cell
        }else if collectionView.tag == 2{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TimeSelecterCollectionViewCell", for: indexPath) as! TimeSelecterCollectionViewCell
            if (self.selectedIndexPath != nil && indexPath == self.selectedIndexPath){
                cell.backgroundColor = UIColor.yellow
                cell.timeOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)

            }
            else{
                cell.backgroundColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.timeOutlet.textColor = UIColor.white
            }
            return cell
        }
        else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SeatMapCollectionViewCell", for: indexPath) as! SeatMapCollectionViewCell
            cell.seatImage.isHidden = false
            cell.seatImage.image = UIImage(named: "available")
            for r1 in 0...rows.count-1{
                for c1 in 0...columns.count-1{
                    if (r1 == c1){

                        for colum in 0...columns[c1].count-1 {
                            for ro in 0...rows[r1].count-1{
                                if indexPath.row == rows[r1][ro] && indexPath.section == columns[c1][colum]{
                                    cell.isHidden = true
                                }
                            }
                        }
                    }
                }
            }
            for i in 0...collectionView.numberOfSections-1{
                for j in 0...sectionHeader.count-1{
                    // for k in 0...rowValue.count-1{
                    if indexPath.section != sectionHeader[j] && indexPath.row == 1{
                        cell.seatImage.isHidden=true
                    }
                    if indexPath.section != sectionHeader[j] && indexPath.row == 0 {
                        cell.seatDetail.isHidden = false
                        cell.seatDetail.text = rowValue[kCounter]
                        cell.seatDetail.textColor = UIColor.white
                        cell.seatImage.isHidden = true
                    }
                    if kCounter<rowValue.count-1{
                        kCounter=kCounter+1
                    }
                    // }
                }
            }
            for i in 0...sectionHeader.count-1{
                if indexPath.section==sectionHeader[i] && indexPath.row==0{
                    cell.seatDetail.isHidden=false
                    cell.seatDetail.text = sectionHeading[i]
                    cell.seatDetail.textColor = UIColor.white
                    cell.seatImage.isHidden = true
                }
            }

            return cell
        }
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if collectionView.tag == 1{
            let cell = collectionView.cellForItem(at: indexPath) as! DateSelecterCollectionViewCell
            if cell.isSelected == true{
                cell.backgroundColor = UIColor.yellow
                cell.dateOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.monthOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
                cell.dayOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
            }

            self.selectedIndexPath = indexPath
        }else if collectionView.tag == 2 {
            let cell = collectionView.cellForItem(at: indexPath) as! TimeSelecterCollectionViewCell
            self.selectedIndexPath = nil
            cell.backgroundColor = UIColor.yellow
            cell.timeOutlet.textColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
        }
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        if collectionView.tag == 1{
            let cell = collectionView.cellForItem(at: indexPath) as! DateSelecterCollectionViewCell
            self.selectedIndexPath = nil
            cell.backgroundColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
            cell.dateOutlet.textColor = UIColor.white
            cell.monthOutlet.textColor = UIColor.white
            cell.dayOutlet.textColor = UIColor.white

        }
        else if collectionView.tag == 2{
            let cell = collectionView.cellForItem(at: indexPath) as! TimeSelecterCollectionViewCell
            self.selectedIndexPath = nil
            cell.backgroundColor = UIColor(red: 44/255, green: 150/255, blue: 208/255, alpha: 1)
            cell.timeOutlet.textColor = UIColor.white

        }
    }

    /* @objc func pinchAction(sender:UIPinchGestureRecognizer){
     var scaleValue: CGFloat!
     if sender.state == .changed || sender.state == .began {
     if scaleValue == nil{
     seatMapCollection.transform = CGAffineTransform.init(scaleX: sender.scale, y: sender.scale)
     scaleValue = sender.scale
     }else{
     seatMapCollection.transform = CGAffineTransform.init(scaleX: scaleValue, y: scaleValue)
     }


     }

     }*/
    //
    //
    //

    // Drop Down Section
    //
    //

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return venue.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DropDownTableViewCell") as! DropDownTableViewCell
        cell.venueDetails.text = "\(venue[indexPath.row])"
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath) as! DropDownTableViewCell
        dropButton.setTitle(cell.venueDetails.text, for: .normal)
        tableView.isHidden = true
    }

    func getSectionCoordinates() -> Array<Int> {
        return sectionHeader
    }
}

这是我的自定义集合视图类:

import UIKit

protocol SeatMapDelegate: class {
    func getSectionCoordinates() -> Array<Int>
}

class CustomCollectionViewLayout: UICollectionViewLayout {
    var delegate: SeatMapDelegate?
    var CELL_HEIGHT = 20.0
    var CELL_WIDTH = 20.0
    let STATUS_BAR = UIApplication.shared.statusBarFrame.height

    var cache = [UICollectionViewLayoutAttributes]()
    var contentSize = CGSize.zero
    var cellAttrsDictionary = [UICollectionViewLayoutAttributes]()
    var cellPadding = 2.0
    var sectionHeader1: Array<Int>!
    var sectionHeader = [0,4,9]

    override var collectionViewContentSize: CGSize{
        return self.contentSize
    }

    var interItemsSpacing: CGFloat = 8

    // 5
    var contentInsets: UIEdgeInsets {
        return collectionView!.contentInset
    }

    override func prepare() {
        var counts: Int = 0
        sectionHeader1=(delegate?.getSectionCoordinates())!
        // Cycle through each section of the data source.
        if collectionView!.numberOfSections > 0 {
            for section in 0...collectionView!.numberOfSections-1 {

                // Cycle through each item in the section.
                if collectionView!.numberOfItems(inSection: section) > 0 {
                    for item in 0...collectionView!.numberOfItems(inSection: section)-1 {
                        // Build the UICollectionVieLayoutAttributes for the cell.
                        let cellIndex = NSIndexPath(item: item, section: section)
                        /* let width: Double = 35.0
                         let height: Double = 35.0
                         CELL_WIDTH = (delegate?.collectionView(Width: width))!
                         CELL_HEIGHT = (delegate?.collectionView(Height: height))!*/
                        if counts<sectionHeader1.count {
                            if item == 0 && section == sectionHeader1[counts]{
                                let xPos = 0.0
                                let yPos = Double(section) * CELL_HEIGHT
                                let frame = CGRect(x: xPos, y: yPos, width: 15 * CELL_WIDTH, height: CELL_HEIGHT)
                                let cellFinalAttribute = frame.insetBy(dx:CGFloat(cellPadding) ,dy:CGFloat(cellPadding))
                                let cellAttributes = UICollectionViewLayoutAttributes(forCellWith: cellIndex as IndexPath)
                                cellAttributes.frame = cellFinalAttribute
                                //cellAttributes.frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT)

                                cellAttrsDictionary.append(cellAttributes)

                                counts=counts+1

                                break
                            }
                        }

                        let xPos = Double(item) * CELL_WIDTH
                        let yPos = Double(section) * CELL_HEIGHT
                        let frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT)
                        let cellFinalAttribute = frame.insetBy(dx:CGFloat(cellPadding) ,dy:CGFloat(cellPadding))
                        let cellAttributes = UICollectionViewLayoutAttributes(forCellWith: cellIndex as IndexPath)
                        cellAttributes.frame = cellFinalAttribute
                        //cellAttributes.frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT)

                        cellAttrsDictionary.append(cellAttributes)
                    }
                }
            }
        }

        // Update content size.
        let contentWidth = Double(collectionView!.numberOfItems(inSection: 0)) * CELL_WIDTH
        let contentHeight = Double(collectionView!.numberOfSections) * CELL_HEIGHT
        self.contentSize = CGSize(width: contentWidth, height: contentHeight)
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        // Create an array to hold all elements found in our current view.
        var attributesInRect = [UICollectionViewLayoutAttributes]()

        // Check each element to see if it should be returned.
        for cellAttributes in cellAttrsDictionary {
            if rect.intersects(cellAttributes.frame) {
                attributesInRect.append(cellAttributes)
            }
        }

        // Return list of elements.
        return attributesInRect
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        return cellAttrsDictionary[indexPath.row]
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return false
    }
}
ios swift uicollectionviewcell
1个回答
0
投票

我不确定你想用sectionHeader1=(delegate?.getSectionCoordinates())!做什么,但你不能像那样使用代表。在你的函数onPrepare中,不能保证你的委托已经被实例化,并且你用!展开它,也就是当你得到异常时。

© www.soinside.com 2019 - 2024. All rights reserved.