【问题标题】:EXC_BAD_INSTRUCTION When Passing UICollectionView Cell Data to Different ViewController将 UICollectionView 单元格数据传递给不同的 ViewController 时的 EXC_BAD_INSTRUCTION
【发布时间】:2017-09-27 19:54:03
【问题描述】:

我有一个基于 Firebase 数据填充的 UICollectionView。我创建了填充 UICollectionView 的自定义单元格:

import UIKit
import Material

class PollCell: CollectionViewCell {

var key: String? {
get {
return self.key
}
}
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var pollQuestion: UILabel!

public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    }
}

我正在尝试访问 UICollectionView 中单击单元格的 pollQuestion 变量并将其传递给另一个 ViewController:

     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toPoll" {
    let pollViewController = segue.destination as! PollController
        if let cell = sender as? PollCell {
            pollViewController.passLabel.text = cell.pollQuestion.text
        }
    }
}

投票控制器:

import UIKit

class PollController: UIViewController {

@IBOutlet weak var passLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }

}

更新:我已经修改了代码,现在收到错误消息

应用程序在运行时崩溃,我正在尝试解决:

【问题讨论】:

    标签: ios swift firebase uicollectionview


    【解决方案1】:

    发生崩溃是因为调用prepare(for segue时尚未连接出口passLabel

    您必须在PollController 中声明一个(临时)变量并在viewDidLoad 中设置标签

    class PollController: UIViewController {
    
        @IBOutlet weak var passLabel: UILabel!
    
        var pass = ""
    
        override func viewDidLoad() {
            super.viewDidLoad()
            passLabel.text = pass
        }
    
    ...
    

    prepare(for segue 中设置变量而不是标签的text 属性:

    let pollViewController = segue.destination as! PollController
        if let cell = sender as? PollCell {
            pollViewController.pass = cell.pollQuestion.text
        }
    }
    

    注意:不建议从视图(单元格)收集信息。获取索引路径并从model(数据源数组)中读取信息。

    【讨论】:

    • 非常感谢,我会试一试。我应该如何根据你的笔记编码?
    • indexPath(for: cell)获取索引路径,然后通过索引路径获取数据源项,然后是属性(如cellForItemAt...)
    • 嗯好吧。将不得不看到。我正在使用 FirebaseUI 数据源项,所以不确定它是否是常规的。
    • 临时变量 (pass) 是一个字符串。
    • 几乎所有严肃的教程(例如raywenderlich.com/113394/storyboards-tutorial-in-ios-9-part-2(在GamePickerViewController 中覆盖prepareForSegue)和Apple 示例代码都使用了从数据源数组中获取数据的方式。
    【解决方案2】:

    您应该使用传递给您的单元格作为发件人,而不是调用为您提供新单元格的 cellForItem。

    if let cell = sender as? PollCell {
        pollViewController.passLabel.text = cell.pollQuestion.text
    }
    

    【讨论】:

    • 我收到一个错误,条件绑定的初始化程序必须具有 Optional 类型,而不是 PollCell
    • 不要用作!但是作为?
    • 如果让 cell = sender as?轮询单元
    • 现在我在更改为 as? 后得到“线程 1:EXC_BAD_INSTRUCTION”。运行时错误
    • 现在你有一个不同的问题。用屏幕截图更新您的问题。它现在在哪条线上失败了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多