【问题标题】:Swift3 and Segue: Two different UITableViewController point to one UIViewSwift3 和 Segue:两个不同的 UITableViewController 指向一个 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

【问题讨论】:

    标签: ios iphone swift3 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
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多