【问题标题】:How to pass data to nth view controller on the UINavigationController stack?如何将数据传递给 UINavigationController 堆栈上的第 n 个视图控制器?
【发布时间】:2018-04-07 04:18:27
【问题描述】:

有 2 个应用程序 A 和 B。

App A 有一个打开 App B 的 url。

App B 打开后,它必须将 5 个视图控制器加载到导航堆栈上,这由以下代码完成:

let LandingVC = self.storyboard?.instantiateViewControllerWithIdentifier("LandingVC") as! LandingVC
let Dashboard = self.storyboard?.instantiateViewControllerWithIdentifier("Dashboard") as! Dashboard
let PlayerVC = self.storyboard?.instantiateViewControllerWithIdentifier("PlayerVC") as! PlayerVC
let PlayerDetailVC = self.storyboard?.instantiateViewControllerWithIdentifier("PlayerDetailVC") as! PlayerDetailVC
let ScoreReportVC = self.storyboard?.instantiateViewControllerWithIdentifier("ScoreReportVC") as! ScoreReportVC
let viewControllersList = [LandingVC, Dashboard, PlayerVC, PlayerDetailVC, ScoreReportVC]
self.navigationController?.setViewControllers(viewControllersList, animated: false)

ScoreReportVC 开始,我需要能够在之前的ViewControllers 上设置变量,以便用户可以导航到之前的屏幕,即使他们从另一个应用程序触发了该应用程序。

这是我尝试过的:在堆栈上和ScoreReportVC 内部的ScoreReportVC 后面的先前视图控制器中定义了一个协议,如下所示:

for viewcontroller in self.navigationController?.viewControllers {
if viewcontroller is PlayerDetailVC {
    PlayerDetailVC.delegate = self
}
if viewcontroller is PlayerVC {
    PlayerVC = self
}
if viewcontroller is Dashboard {
    Dashboard.delegate = self
}
if viewcontroller is LandingVC {
    LandingVC.delegate = self
}
}

但是代表没有被召唤。任何帮助如何正确地将数据传递给堆栈上的所有ViewControllers 将不胜感激。

【问题讨论】:

  • 从 ScoreReportVC 弹出时会发生什么?
  • 我无法判断这个问题,因为调试器在后台线程停止并且不会显示上一个屏幕。
  • 也许您的 UIViewControllers 实例比您预期的更快从内存中删除,这可能是未调用委托方法的原因。
  • 另外,您是否尝试过将委托设置在循环之外?只是好奇。
  • 尝试将其设置在循环之外,结果相同。尝试回溯并能够看到导航堆栈上仍然存在的所有视图控制器。

标签: ios swift uinavigationcontroller delegates protocols


【解决方案1】:

对于相关类,我们使用委托。但是对于那些不相关的类,我们使用通知。在您的情况下,将需要通知来实现并将数据从一个 VC 传递到另一个 VC。

【讨论】:

    【解决方案2】:

    更好的方法是在创建控制器时创建/设置变量。

    【讨论】:

    • 第 n 次发生网络调用ViewController,但它们比网络调用更早地添加到堆栈中。所以我认为这是不可行的。
    • 那么你所有的控制器都应该采用一个通用协议,使用通用参数更新变量。
    • 协议是我实现的。所有协议都不起作用。如果我将其全部推广到一个协议中会有什么不同?
    • 采用协议后,您不需要使用委托,您可以直接调用相应控制器的那些方法,如 viewcontroller.someMethod()
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多