最近在群里见不少人 问到用视图控制器的alloc /init方法初始化的时候,出来的是黑色的空界面。之前我也遇到过,所以在这里总结下。

我们在项目中肯定都会用到自定义的ViewController,而视图控制器的创建无非三种:1、纯代码;2、用xib创建;3、在storyboard上创建,但是它们的初始化方式却不太相同。下面我们来讲i述一下视图控制器的创建,假设我新建了一个视图控制器MyViewController,它继承于UIViewController:

1、纯代码创建,没有用xib和storyboard,那么我想创建一个MyViewController时,可以这样写

MyViewController *myVC = [MyViewController alloc] init];

然后做对myVC做相应的操作,比如从某个界面push到myVC ,

[self.navigationController pushViewController:myVC animated:YES];

2、用xib创建,存在一个名称为MyViewController.xib的文件,并且与MyViewController做了关联,那么我们依然可以用

MyViewController *myVC = [MyViewController alloc] init];

然后做对myVC做相应的操作。

3、如果是用storyboard 创建了MyViewController视图控制器,那么我们新建视图控制器对象,又要分两种情况,假如我们是从AViewController 跳转到MyViewControoler这种情景,要分两种情况:

第一种、如果AViewController 也是由storyboard 创建出来的那么我们对于MyViewController的创建可以这样写

MyViewController *myVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];

当然前提是,我们在用storyboard创建MyViewController的时候设置了其 Storyboard ID为"MyViewController",否则myVC
也是nil。

第二种、如果AViewController不是由storyboard创建,比如用代码或者xib创建,那么就不能用self.storyboard,我们需要先取到存放MyViewController的那个stoaryboard
,假如它叫MainStoryboard.storyboard,我们可以这样初始化,先取到storyboard ,

	UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
MyViewController *myVC = [mainStoryboard instantiateViewControllerWithIdentifier:@"MyViewController"];

然后再对myVC做其他操作。

总结一下,为什么前两种情况可以用alloc/init方法创建,而最后这种情况却不可以呢?

因为UIViewController 的alloc/init 其实是调用了alloc/initWithNibName:bundle:方法,alloc/init其实默认的这两个参数为nil,那么系统会先去查找与视图控制器同名的xib文件,如果存在,则使用这个视图控制器,如果不存在,则就直接执行nitWithNibName:bundle:,代码创建的,也会被执行,所以前两种情况可以用alloc/init方法,而最后这种情况是因为alloc/init并不会检查storyboard是否存在同名的这个视图控制器,所以用alloc/init时,就完全执行了代码部分,但是代码部分并没有设置view,所以就是黑色的空的。

最新文章

  1. 下订单存储过程 - MYSQL
  2. SQL Server 2008 R2——使用FOR XML PATH实现多条信息按指定格式在一行显示
  3. 【kAri OJ 616】Asce的树
  4. 视频处理控件TVideoGrabber部分技术问题解答
  5. RViz 实时观测机器人建立导航2D封闭空间地图过程 (SLAM) ----27
  6. Http网络通信--网络图片查看
  7. CFileDialog的用法
  8. Oracle AWR报告指标全解析-11011552
  9. js关于setTimeout传参
  10. 「JOISC 2018 Day 3」比太郎的聚会
  11. env:bash \r解决
  12. 3月25 JavaScript 练习题
  13. .NET实现自动编译
  14. SOA及分布式
  15. Linux (RHEL)修改时区
  16. [Vue warn]: Cannot find element: #app
  17. 下载Centos7 64位镜像
  18. 端口占用处理(Windows)
  19. C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别
  20. jso cpp解析读写数据

热门文章

  1. hdu3966 点权模板-树链部分
  2. 用HTTP状态码实现提交表单后刷新页面不重复提交
  3. filter和listener的生命周期
  4. Python小代码_7_字符串的字符次数统计
  5. Day 2 Python数值计算
  6. ftp传二进制文件时一定要用二进制模式,否则内容会有变化,造成后处理莫名其妙的错误,还以为传输前后内容一致,其实已变化。
  7. 关于java的Synchronized,你可能需要知道这些(下)
  8. Jmeter(三)_配置元件
  9. 解决ASP.NET MVC 检测到有潜在危险的 Request.Form 值
  10. Bootstrap3 表格-响应式表格