在集合视图中展开可选值时出乎意料地发现了Nil

时间:2017-04-09 14:35:56

标签: ios swift core-data uicollectionview

我最近创建了一个新的视图控制器,其中包含一个集合视图。我还有其他视图控制器也有集合视图。

我面临的问题是我正在尝试将重新加载函数用于新的集合视图,但它会给出错误:'致命错误:在解包可选值时意外发现nil (LLDB)'

我最好的假设是它给出错误的原因是新集合视图的设置与其他两个不同(.reloadData()在其他两个视图中工作正常)。这是新集合视图上viewDidLoad的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    //self.resultsColl.delegate = self
    //self.resultsColl.dataSource = self

    testHashAt = textFieldFHash.text!
}

我注释掉了委托和dataSource行,因为这是主要错误。在另外两个视图控制器中,我有这两个函数并且它们完美地工作,但是当我在新的集合视图中使用它时,我得到了与.reloadData()相同的错误。

我认为这就是我无法使用.reloadData()函数的原因。我已将集合视图作为dataSource和delegate添加到视图控制器中,并在类声明中添加:

class HashtagViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

另外只是因为这是错误,这是我的getData()函数,下面是cellForItemAt和numberOfItemsInSection函数以及viewWillAppear:

func getData() {

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        let fetchRequest: NSFetchRequest<Task> = Task.fetchRequest()
        fetchRequest.predicate = NSPredicate.init(format: "hashtag = %@", testHashAt);
        taskTwo = try context.fetch(fetchRequest)
    }

    catch {
        print("Get Data failed")
    }

    // Fetches data.
}

和cellForItemAt和numberOfItemsInSection:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return taskTwo.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let taskTHash = taskTwo[indexPath.row]

    let cellHash = collectionView.dequeueReusableCell(withReuseIdentifier: "nCell", for: indexPath) as! HashCollectionViewCell


    if testHashAt == taskTHash.hashtag {
        cellHash.labelFHash.text = taskTHash.name!
    }
    else {
        print("blank cell?")
    }

    if cellHash.labelFHash.text == "" {
        print("cell is nil")
    }

    cellHash.layer.cornerRadius = 25

    return cellHash
}

和viewWillAppear:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    getData()
    resultsColl.reloadData()
}

我不知道为什么这个集合视图不能与dataSource,delegate和reloadData()一起使用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您没有从代码创建集合视图..检查您是否在视图控制器中连接了集合视图的正确IBOutlet

答案 1 :(得分:0)

我解决了这个问题。

我不确定导致它的原因但是我在视图控制器中删除了集合视图的声明并重新添加了IBOutlet,这似乎解决了这个问题。正如@PhillipMills所说,当我添加它时,集合视图可能是零,我认为这是问题的原因。谢谢你的帮助!