0

所以,我跟着这个教程:http ://enroyed.com/ios/how-to-pass-data-between-ios-tab-bars-using-delegate/

本教程最重要的部分:

- (void)viewDidLoad
{
[super viewDidLoad];
   SecondViewController *svc = [self.tabBarController.viewControllers objectAtIndex:1];
svc.delegate = self; //important !! otherwise delegation will not work !
}

问题是即使我把它放在“viewWillLoad”中,它仍然会迫使我在它初始化之前点击我的标签。在单击选项卡之前如何指定它?

编辑

我有一个三标签项目。我在链接中使用了该教程,将数据从选项卡 1 传递到选项卡 2。传递的数据是从选项卡 1 上的 web 视图到选项卡 2 上的 url 的 url。当我单击第一个选项卡上的链接时,url 会通过。

数据确实通过了,但前提是我先物理单击第二个选项卡,然后单击返回第一个选项卡并单击链接。

因此,在我看来,我上面的代码只有在我实际单击第二个选项卡时才会运行。

4

1 回答 1

0

您的问题是 - 直到您实际转到选项卡项目 2 之前,secondViewController它还没有完全初始化,因此没有数据可以从 vc2 传输到 vc1。特别是,secondViewController的视图还没有加载,所以它的滑块还没有任何值,也没有滑块,所以也没有 IBAction 方法可以调用来触发委托方法。实际上,由于数据传输仅在 VC2 中移动滑块时触发,因此很明显,在您转到vc2并移动滑块之前,什么都不会发生。

您链接到的示例使用委托模式,这似乎是处理您的问题的一种相当糟糕的方法。委托模式最适合在委托人(拥有)和被委托人(所有者)之间存在层次关系的场景......并非总是如此,但最常见。在标签栏控制器中,这些关系更像是标签栏控制器本身的亲属关系。

你没有在你的问题中提供足够的细节来说明你想要达到的目标,但你需要考虑这一点:

当 tabBarController 加载时,它的所有子视图控制器都被初始化,但它们的视图没有加载

这意味着这些方法确实被调用:

//if loading from a xib or in code
- (id) initWithNibName:bundle

//if loading from a storyboard
- (id) initWithCoder:
- (void) awakeFromNib

但是视图加载方法(viewDidLoadviewWillAppear)不会被调用,因为除非您实际打开相关选项卡,否则视图不会被加载。

您可以通过将初始化变量放入 viewController2(在其中一种init方法中)并通过 vc1 中的属性语法访问该变量来解决此问题。但是,您不妨直接将初始化值放入 vc1。您需要仔细考虑每个 vc 是如何相互依赖的,如何解耦这种依赖关系,或许还需要考虑如何设置两个 vc 都可以根据需要访问的独立数据源。这可能是一个模型类,或NSUserDefaults,或你的属性appDelegate......只是许多可能的解决方案中的几个。

于 2013-04-13T02:33:01.290 回答