【问题标题】:UIViewController's dictionary attribute being set but null in viewDidLoad()UIViewController 的字典属性被设置但在 viewDidLoad() 中为空
【发布时间】:2020-01-22 00:43:23
【问题描述】:

所以我有一个 ViewController 在调用 didSelectRowAt 时导航到另一个。我导航到新的视图控制器:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let accountInsightsViewController:AccountInsightsViewController = AccountInsightsViewController(nibName: "AccountInsightsViewController", bundle: nil)
    accountInsightsViewController.accountDetailsObjectFromSourceController = self.accountDetailsObjectFromSourceController
   accountInsightsViewController.accountDetailsObjectFromSourceController["accountId"] = self.accountDetailsObjectFromSourceController["accountId"]
    if let navigator = navigationController {
        navigator.pushViewController(accountInsightsViewController, animated: true)
    }

}

然而,在这个新的视图控制器的viewDidLoad() 函数中,属性accountDetailsObjectFromSourceController 再次变成了一个空字典。在调试的时候,我可以清楚的看到,当我把这个属性字典设置为相同结构的字典时,恰好将字典的值正确地设置为具有3个键/值对的字典。但是,当 navigationController 推送这个 VC 时,它会崩溃,因为这个字典在新 VC 的 viewDidLoad() 内有 0 个键/值对

有人能告诉我为什么要设置这个值,但是当它导航到这个 VC 时,字典是空的吗?视图控制器以自己的 XIB 文件和 VC Swift 文件的形式出现。显然我在做正确的事情,它命中了viewDidLoad(),但为什么它不采用我在pushViewController 之前设置的值?

【问题讨论】:

  • 也许 - 错误地 - 您还配置了从单元格到洞察视图控制器的 segue,然后它也会被推送到导航堆栈上,从而导致问题。请检查 segues 或检查是否真的只有一个见解视图控制器存在(这是您在 didSelectRowAt 中创建的那个。
  • 没有转场。我的代码清楚地表明它正在由导航控制器导航

标签: ios swift dictionary navigation


【解决方案1】:

有趣的问题。它是通过首先对字典值进行硬编码来解决的。在这种情况下,还有另一个潜在的问题导致 VC 无法出现。这是问题的解决方案:Loaded nib but the 'view' outlet was not set

一旦 VC 加载了硬编码值,它就不会“重置”在 pushViewController 之前传入的字典。该问题源于试图将 VC UI 从情节提要迁移到单独的 XIB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多