一个简单的 performSegue throws 和 prepare for segue func 错误

a simple performSegue throws and error in prepare for segue func

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

@IBAction func requestPanel(_ sender: Any) {

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

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

但这与我的其他 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
}


}

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

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

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

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

您的 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
        }
    }
}