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;
vControler.class的两个日志都返回了代码的2部分,一切都很好,但是在第二种情况下,对mPortSIPSDK的调用不起作用。
最佳答案
从instantiateViewControllerWithIdentifier:
的文档中
此方法创建指定视图控制器的新实例
每次您调用它时。
因此,第二种方法将创建视图控制器的新实例,
第一个方法返回视图控制器的现有实例
连接到标签栏。
备注:@trojanfoe正确注释后,首选方法是将mPortSIPSDK
声明为@property
(如果尚未这样做),然后访问属性(使用“点符号”),而不是直接访问实例变量(使用“->”):
vControler.mPortSIPSDK = mPortSIPSDK;
更新:据我了解,您遇到以下问题:
AppDelegate
具有一个实例变量
mPortSIPSDK
(是的,它是示例项目中的一个实例变量,在这里我不会谈论实例变量vs属性:-)在某些视图控制器中,您需要此变量。在示例项目中,
AppDelegate将
mPortSIPSDK
传递给选项卡栏控制器的所有视图控制器。您可以在您的应用中执行相同的操作:AppDelegate将
mPortSIPSDK
传递给初始视图控制器。当您从一个视图控制器选择到另一个时,
您将
mPortSIPSDK
传递到下一个视图控制器(在prepareForSegue
中)等等。
另一种方法是,每个视图控制器从“视图”中“获取”
mPortSIPSDK
。AppDelegate。这将要求您使
mPortSIPSDK
可以公开访问(一个
@property
或至少一个@public
实例变量)。但我实际上更喜欢第一种(“通过指挥棒”)方法。
关于ios - 停留在IOS的基础上,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21329655/