Swift3 和 Segue:两个不同的 UITableViewController 指向一个 UIView
Posted
技术标签:
【中文标题】Swift3 和 Segue:两个不同的 UITableViewController 指向一个 UIView【英文标题】:Swift3 and Segue: Two different UITableViewController point to one UIView 【发布时间】: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
【问题讨论】:
【参考方案1】:您是如何从您的DetailViewController
返回到调用表视图控制器的?
在我看来,您使用的是正常的转场,这是错误的。
您可以使用展开转场,也可以使用与您使用的任何方法相反的方式到达那里(如果您使用推送转场,请致电 pop()
,如果您使用模态呈现,请致电 dismiss()
。)
【讨论】:
我使用这些来自苹果的官方教程,不同的是我有 2 个表,而不仅仅是一个 (developer.apple.com/library/content/referencelibrary/…)。如我的截图所示,我的保存按钮调用在我的 DetailViewController 中准备,将更改存储在我的资产中,然后跳回(到错误的表)。两个 UITableView 中都有 unwind 方法来对 unwind 做出反应。有没有办法设置正确的segue?在教程中,我从不叫dismiss,只有在“取消”时才叫 “如我的截图所示(原文如此),我的安全按钮调用准备...” 您没有从 DetailViewController 的保存按钮操作中发布任何代码。这就是我们需要看到的代码。你说“......我的保存按钮调用准备在我的 DetailViewController 中,将更改存储在我的资产中,然后跳回(到错误的表)。”你是什么意思“电话准备”? “跳回来”是什么意思?显示该代码。 啊,好吧,我发现了我的错误,我将情节提要中的保存按钮从画布控制拖到了 Exit 事件,并选择了 tableview one 的 unwind segne。我想它可以在代码中动态更改正确表的调用展开方法:) 是的,如果您需要同一个按钮来调用多个 segue,您通常希望将按钮链接到 IBAction,然后决定代码中的哪个 segue。这也应该适用于 unwind segues。 (我不认为我以前必须做这个具体的事情,但这似乎是合理的。) ok 找到了问题和解决方案。我在第二个 UITableView 中的展开方法中有一个错字。然后系统找不到unwind方法而是跳转到第一个UITableView以上是关于Swift3 和 Segue:两个不同的 UITableViewController 指向一个 UIView的主要内容,如果未能解决你的问题,请参考以下文章
Swift:prepareForSegue 有两个不同的 segue
在 tableviewcell 中使用 UITableview 执行 segue
IOS开发。如何通过 segue 连接不同故事板中的两个场景