坚持基础IOS
Posted
技术标签:
【中文标题】坚持基础IOS【英文标题】:Stuck on basics 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 时不会执行任何错误... 【参考方案1】:来自instantiateViewControllerWithIdentifier:
的文档
此方法创建指定视图控制器的新实例 每次调用它。
所以你的第二个方法创建了一个视图控制器的 new 实例, 第一个方法返回视图控制器的现有实例 连接到标签栏。
备注: 正如@***foe 正确评论的那样,首选方法是将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;
【讨论】:
这个答案与问题有什么关系?以上是关于坚持基础IOS的主要内容,如果未能解决你的问题,请参考以下文章
IOS账号分享 |《和平精英》这是一款多人竞技游戏,无论你用什么方法只需要坚持到最后并消灭所有敌人