坚持基础IOS

时间:2014-01-24 10:01:13

标签: ios uiviewcontroller appdelegate

Ios的新手可以解释为什么会这样有效:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
vControler = [tabBarController.viewControllers objectAtIndex:0];

vControler ->mPortSIPSDK =mPortSIPSDK;

而这不是:

UIStoryboard *mainStoryboard =  [UIStoryboard storyboardWithName:@"Main" bundle:nil];

vControler = [mainStoryboard instantiateViewControllerWithIdentifier: @"restorTest”];
vControler ->mPortSIPSDK =mPortSIPSDK;

对于代码的2部分,vControler.class的两个日志都返回相同,但在第二种情况下调用mPortSIPSDK不起作用。

2 个答案:

答案 0 :(得分:1)

这样做,它会起作用

FirstViewController v1 = [[FirstViewController alloc]init];

SecViewController v2 = [[SecViewController alloc]init];

UITabBarController *tabBar = [[UITabBarController alloc]init];

tabBar.viewControllers =[[NSArray alloc]initWithObjects:v1,v2,nil];

self.window.rootViewController =tabBar;

答案 1 :(得分:1)

来自instantiateViewControllerWithIdentifier:

的文档
  

此方法创建指定视图控制器的新实例   每次你打电话。

因此,您的第二种方法会创建视图控制器的 new 实例, 第一种方法返回视图控制器的现有实例 它连接到标签栏。

备注:在@trojanfoe正确评论时,首选方法是将mPortSIPSDK声明为 a @property(如果你还没有这样做)然后访问属性(使用“点符号”)而不是直接访问实例变量(使用“ - >”):

vControler.mPortSIPSDK = mPortSIPSDK;

更新:据我了解,您遇到以下问题:AppDelegate有 一个实例变量mPortSIPSDK(是的,它是你得到的示例项目中的一个实例变量,我不会在这里讨论实例变量vs属性:-) 在某些视图控制器中,您需要此变量。在示例项目中, AppDelegate将mPortSIPSDK传递给标签栏控制器的所有视图控制器。

您可以在自己的应用中执行相同操作:AppDelegate将mPortSIPSDK传递给 初始视图控制器。当您从一个视图控制器转到下一个视图控制器时, 您将mPortSIPSDK传递给下一个视图控制器(在prepareForSegue中) 等等。

另一种方法是每个视图控制器从“提取”mPortSIPSDK AppDelegate中。这需要您公开mPortSIPSDK (一个@property或至少一个@public实例变量)。 但我实际上更喜欢第一种(“传递接力棒”)方法。