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