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不起作用。
答案 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
实例变量)。
但我实际上更喜欢第一种(“传递接力棒”)方法。