【问题标题】:Stuck on basics IOS坚持基础IOS
【发布时间】:2014-01-24 10:01:12
【问题描述】:

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 不起作用。

【问题讨论】:

  • 发布编译器错误信息。
  • 我认为你应该在获取故事板时提供应用程序的主包:[NSBundle mainBundle] 但你确实得到了什么错误?
  • 嗨,伙计们,如果 1 种情况一切正常,2 种情况不执行,则仅调用 mPortSIPSDK 时不会执行任何错误...

标签: ios uiviewcontroller appdelegate


【解决方案1】:

来自instantiateViewControllerWithIdentifier:的文档

此方法创建指定视图控制器的新实例 每次调用它。

所以你的第二个方法创建了一个视图控制器的 new 实例, 第一个方法返回视图控制器的现有实例 连接到标签栏。

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

vControler.mPortSIPSDK = mPortSIPSDK;

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

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

另一种方法是每个视图控制器“获取”mPortSIPSDK 从 应用委托。这将要求您使 mPortSIPSDK 可公开访问 (一个@property 或至少一个@public 实例变量)。 但我实际上更喜欢第一种(“传递接力棒”)方法。

【讨论】:

  • 您可能还想向他提及使用-> 运算符访问实例变量。
  • 感谢您的反馈 :),那么如何在应用委托中获取视图控制器的现有实例?什么处理 -> :)
  • @Waylli:您的第一个代码示例工作正常,为什么不能使用它? - (关于“->”:搜索“objective c property vs instance variable”,对此有很多意见,但可能与您的具体问题无关。)
  • @MartinR 我想使用导航 VC 并制作自定义 segues 而不仅限于 TabbarNavigation....
  • @Waylli:也许你可以更具体一点:vController 是什么?您何时何地设置vControler.mPortSIPSDK?也许prepareForSegue 是您要找的?
【解决方案2】:

这样做,它会工作

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;

【讨论】:

  • 这个答案与问题有什么关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2011-10-19
  • 2011-10-03
  • 1970-01-01
相关资源
最近更新 更多