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/

10-15 07:06