坚持基础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的主要内容,如果未能解决你的问题,请参考以下文章

坚持解析从服务器返回的 JSON,ios

Charles Proxy iOS 坚持安装配置文件

仅仅要坚持 一定会收获成功

IOS账号分享 |《和平精英》这是一款多人竞技游戏,无论你用什么方法只需要坚持到最后并消灭所有敌人

C语言基础学习笔记+ C语言进阶学习笔记总结篇(坚持才有收获!)

2018把坚韧坚持到底