一个简单的 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
}
}
}
也许有些愚蠢,但我只是想简单地从一个表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
}
}
}