【问题标题】:a simple performSegue throws and error in prepare for segue func一个简单的 performSegue 抛出和错误准备 segue func
【发布时间】:2017-11-12 22:19:26
【问题描述】:

也许有些愚蠢,但我试图简单地从 tableviewController 移动到 viewController 不传递任何数据只是一个简单的移动使用

@IBAction func requestPanel(_ sender: Any) {

   performSegue(withIdentifier: "sendMail", sender: AnyObject)
}

然后我在准备 segue 函数时遇到错误。

但这与我的其他转场有什么关系?

我知道,由于没有数据,该 segue 会遇到麻烦。

正如您在此处看到的,segue 高于为 segue 做准备。

@IBAction func requestPanel(_ sender: Any) {

    self.performSegue(withIdentifier: "sendMail", sender: AnyObject.self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var indexPath: IndexPath = self.tableView.indexPathForSelectedRow!
    let desti = segue.destination as! DeviceDetailTableViewController

    let selectedRecord = onlineDevices[indexPath.row]

    let panelWidth = selectedRecord.object(forKey: "panelwidth") as? String
    let panelHight = selectedRecord.object(forKey: "panelhight") as? String
    let panelPitch = selectedRecord.object(forKey: "panelpitch") as? String
    let panelPower = selectedRecord.object(forKey: "panelpower") as? String
    let panelWeight = selectedRecord.object(forKey: "panelweight") as? String
    let panelMaker = selectedRecord.object(forKey: "maker") as? String
    let panelModel = selectedRecord.object(forKey: "model") as?      String

    desti.pawidth = panelWidth!
    desti.pahight = panelHight!
    desti.papitch = panelPitch!
    desti.papower = panelPower!
    desti.weight = panelWeight!
    desti.maker = panelMaker!
    desti.model = panelModel!
}



 override func numberOfSections(in tableView: UITableView) -> Int {
 return 1
 }
 override func tableView(_ tableView: UITableView,   numberOfRowsInSection section: Int) -> Int {
 return onlineDevices.count
 }
   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "DeviceCell", for: indexPath)

    // Configure the cell...

    let noteRecord: CKRecord = onlineDevices[(indexPath as IndexPath).row]

    cell.textLabel?.text = noteRecord.value(forKey: "maker") as? String
    cell.detailTextLabel?.text = noteRecord.value(forKey: "model") as? String


    return cell
}


}

【问题讨论】:

  • 每当你调用 perform segue 方法时,它都会创建一个 segue 和你想要进行 segue 的新视图控制器。如果这样做了,系统将调用 prepare 让您有机会将数据传递给下一个视图控制器。由于您在此处丢失数据并强制解包,因此在尝试转场时会崩溃。
  • 您的 segue 是通过按钮触发的,而不是通过选择行来触发的,因此请在尝试获取所选行之前检查您的 segue 标识符。
  • 不要显示代码图片。显示代码
  • @vacawama 是的,segue 是从 UIBarbutton 触发的,女巫是正确的,因为我不想带来任何数据。
  • @matt 好的,这是代码

标签: ios swift uitableview uistoryboardsegue


【解决方案1】:

viewController 中的所有 segue 都将通过相同的 prepare(for:sender:) 方法。您需要使用segue.identifier 以不同方式处理不同的segue。

您的sendMail segue 来自UIBarButton 操作,而不是来自选定的行,因此请检查该 segue 并单独处理:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "sendMail" {
        // nothing extra to be done here
    } else {
        // do your normal path here
        if let indexPath = self.tableView.indexPathForSelectedRow {
            // you have a valid selected row so proceed
        }
    }
}

【讨论】:

    【解决方案2】:

    错误信息很清楚。您在没有选择任何行时说tableView.indexPathForSelectedRow。因此,该值为nil,当您强制解开它时会崩溃。

    当您唯一的转场是由用户选择表格的一行触发时,您编写了原始的prepareForSegue。但是this segue 不是由用户选择表格的一行触发的;它由用户点击按钮触发。您必须考虑到这种差异。

    (这是整个架构的一个主要缺陷:来自给定视图控制器的所有 segue 都流入同一个 prepareForSegue,这成为了瓶颈。)

    【讨论】:

    • 我的 table segue 工作正常,只是在新的 VC 中添加了另一个 segue,然后遇到了问题。
    • 因为您写了自己的原始prepareForSegue 却不了解它的含义或工作原理?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多