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的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift3中完成5个文件下载请求后执行segue

Swift:prepareForSegue 有两个不同的 segue

在 tableviewcell 中使用 UITableview 执行 segue

IOS开发。如何通过 segue 连接不同故事板中的两个场景

swift 3 prepare(for segue:) 功能坏了? [复制]

两个不同的按钮对同一个视图控制器执行 segue,但希望通过一个按钮禁用用户交互以进行 segue