Code Bye

问一下苹果设计的原因,这样为什么不能弹出B(UIViewController)

请看
在StoryBoard上拉2个UIViewController,然后创建2个UIViewController类分别关联这2个UIViewController,设为A和B,然后,在A中,
B * b = [[B  alloc] init];
[self presentViewController:b animated:NO completion:nil];
这样为什么弹不出B,非要写成
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@”Main” bundle:[NSBundle mainBundle]];
B *b = (B*)[storyboard instantiateViewControllerWithIdentifier:@”test”];
[self presentViewController:b animated:NO completion:nil];
这样的方式,
苹果为什么这么弄?
它已经知道了B对应mainboard中哪个UIViewController,从技术上,第一种方式完全可以弹出B啊,这样,我们编码不是很方便么?
解决方案

10

你可以这么理解这个事
你在storyboard中会创建很多viewcontroller对吧,例如你说的这个例子中你创建了A和B两个viewcontroller.
那么你就可以当作程序一运行起来,这两个viewcontroller就已经由storyboard帮你创建好了,所以你要用的时候直接根据他们的唯一标识符去取就可以了,也就是你的代码中写的这一句
B *b = (B*)[storyboard instantiateViewControllerWithIdentifier:@”test”];
这样你就可以获取到正确的b了
现在来推理一下为什么B * b = [[B  alloc] init];这个语句不行
其实很简单,原因是你B里面的全部视图都是创建在storyboard中的(相信你在B中没有写半句关于创建视图的代码吧)
所以这里创建出来的b就什么都没有
致于苹果为什么这么设计,理由也很简单,为了m和v解耦

10

引用:

谢谢答复,本人还是有些疑问:
本人在B中,确实没有写半句关于创建视图的代码,但是,已经在StoryBoard中设置了 B 和storyboard中某一个viewconroller的关联,它可以根据这个关联关系从storyboard中找到视图啊。找到了,不就可以创建出来了么?

那是原因是vc的视图和类并非是固定的一对一的关系,你忘记了还有一种创建vc写法吗?
UIViewController *vc = [[UIViewController alloc] initWithNibName:@”xxxib” bundle:nil];
就是说vc的视图也可以通过xib文件创建,假如没有storyboard和xib或其他的视图文件时才用你那种创建方式,然后用代码去生成各个视图,所以需要用到哪个界面文件文件必需在创建的时候由你本人去指定


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下苹果设计的原因,这样为什么不能弹出B(UIViewController)