在选项卡中的ViewDidLoad之前指定委托

时间:2013-04-13 01:55:46

标签: ios delegates uitabcontroller

所以,我遵循了本教程: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上的webview到选项卡2上的URL的URL。当我单击第一个选项卡上的链接时,url会通过。

数据确实通过了,但是只有我先点击第二个标签然后再点击返回第一个标签然后点击链接。

所以,在我看来,上面的代码只有在我点击第二个标签时才会运行。

1 个答案:

答案 0 :(得分:0)

您的问题是 - 直到您实际转到标签项2,secondViewController未完全初始化,因此没有数据可以从vc2传输到vc1。特别是,secondViewController的视图尚未加载,因此从它的滑块中没有任何值,也没有滑块,因此也没有IBAction方法来调用以触发委托方法。实际上,由于数据传输仅在移动VC2中的滑块时触发,因此在您到vc2 并移动滑块之前应该是相当明显的,所以没有任何内容发生。

您链接的示例使用委派模式,这似乎是处理问题的一种相当差的方法。委托模式最适合委托人(拥有)和委托人(所有者)之间存在层次关系的情况......并不总是,但最常见。在标签栏控制器中,关系更像是与标签栏控制器本身的相似子关系。

关于你想要达到的目标,你没有在问题中提供足够的细节,但你需要考虑这个:

当tabBarController加载时,它的所有子viewControllers都是初始化,但它们的视图不是已加载

这意味着会调用这些方法:

//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如何依赖于另一个,如何分离该依赖关系,以及如何设置vcs可以根据需要访问的独立数据源。这可以是模型类,或NSUserDefault,或appDelegate中的属性......只是众多可能解决方案中的一小部分。