【发布时间】:2017-10-13 12:56:15
【问题描述】:
我在 Swift3 中有一个应用程序,它由 2 个不同的 UITableView 组成,显示类资产的详细信息。两个表中的数据内容相同/相似(有一些过滤器),呈现方式不同。因此,其中一个 UIViewTables 显示例如每个资产的 cmets,另一个更关注状态。
如果用户单击表格单元格,两个 UITableView 会打开同一个 UIView 以获取完整详细信息,因为两个表格最后代表相同的数据。
我嵌入了一个 UINavigationControl 并为每个 TableCell 做了一个 segue。如果我单击单元格,则会打开正确的详细信息屏幕。
但如果我保存它,它总是让我回到第一张桌子,即使我从第二张开始。
谁能给我一个提示?
这是我点击保存按钮时调用的 DetailViewController 准备方法。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
print(segue.identifier)
// Configure the destination view controller only when the save button is pressed.
guard let button = sender as? UIBarButtonItem, button === btnSave else
{
//os_log("The save button was not pressed, cancelling", log: OSLog.default, type: .debug)
return
}
asset?.name = tfDeviceName.text ?? ""
//here comes some other stored asset information...
}
这是我的第一个 UITableViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "")
{
case "AddItem":
os_log("Adding a new asset.", log: OSLog.default, type: .debug)
case "ShowDetails":
guard let assetDetailViewController = segue.destination as? DetailViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let selectedAssetCell = sender as? AssetTableViewCell else {
fatalError("Unexpected sender: \(String(describing: sender))")
}
guard let indexPath = tableView.indexPath(for: selectedAssetCell) else {
fatalError("The selected cell is not being displayed by the table")
}
selectedIndex = indexPath.row
let selectedAsset = assets[indexPath.row]
assetDetailViewController.asset = selectedAsset
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
editMode = true
}
这是我的第二个 UITableViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
switch(segue.identifier ?? "") {
case "AddItem":
os_log("Adding a new asset.", log: OSLog.default, type: .debug)
case "ShowTask":
guard let taskDetailViewController = segue.destination as? DetailViewController else {
fatalError("Unexpected destination: \(segue.destination)")
}
guard let selectedAssetCell = sender as? TaskTableViewCell else {
fatalError("Unexpected sender: \(String(describing: sender))")
}
guard let indexPath = tableView.indexPath(for: selectedAssetCell) else {
fatalError("The selected cell is not being displayed by the table")
}
let selectedAsset = assets[indexPath.row]
taskDetailViewController.asset = selectedAsset
default:
fatalError("Unexpected Segue Identifier; \(String(describing: segue.identifier))")
}
}
谢谢! BR 斯蒂芬
使用解决方案编辑:
感谢 Duncans 提示我发现了我的问题。通过 crtl-click-drag 按钮到退出事件,然后选择 unwind 方法,将展开操作附加到界面构建器中的保存按钮。重要的事情来了:您只能选择一种方法,但不能选择类。该类由管理导航的系统自动选择,但两种方法(显然)必须具有相同的展开名称。我打错了,所以第二个 UITableView 中的展开方法略有不同,然后系统在正确的 UITableView 中找不到该方法并跳转到具有正确方法的 UITableView,即使这个类不是原始的 segue
【问题讨论】: