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

onunix 2016-04-29 05:33:47
请看
在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啊,这样,我们编码不是很方便么?
...全文
218 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
onunix 2016-04-30
  • 打赏
  • 举报
回复
谢谢答复,我还是有些疑问: 我在B中,确实没有写半句关于创建视图的代码,但是,已经在StoryBoard中设置了 B 和storyboard中某一个viewconroller的关联,它可以根据这个关联关系从storyboard中找到视图啊。找到了,不就可以创建出来了么?
onunix 2016-04-30
  • 打赏
  • 举报
回复
引用 1 楼 disburden 的回复:
你可以这么理解这个事 你在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解耦
谢谢答复,我还是有些疑问: 我在B中,确实没有写半句关于创建视图的代码,但是,已经在StoryBoard中设置了视图和storyboard中某一个viewconroller的关联,它可以根据这个关联关系从storyboard中找到视图啊。找到了,不就可以创建出来了么?
不担心 2016-04-30
  • 打赏
  • 举报
回复
引用 3 楼 onunix 的回复:
谢谢答复,我还是有些疑问: 我在B中,确实没有写半句关于创建视图的代码,但是,已经在StoryBoard中设置了 B 和storyboard中某一个viewconroller的关联,它可以根据这个关联关系从storyboard中找到视图啊。找到了,不就可以创建出来了么?
那是因为vc的视图和类并非是固定的一对一的关系,你忘记了还有一种创建vc写法吗? UIViewController *vc = [[UIViewController alloc] initWithNibName:@"xxxib" bundle:nil]; 就是说vc的视图也可以通过xib文件创建,如果没有storyboard和xib或者其他的视图文件时才用你那种创建方式,然后用代码去生成各个视图,所以需要用到哪个界面文件文件必需在创建的时候由你自己去指定
不担心 2016-04-29
  • 打赏
  • 举报
回复
你可以这么理解这个事 你在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解耦

29,027

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧