iOS视图控制器初始化问题
最近在群里见不少人 问到用视图控制器的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,所以就是黑色的空的。
iOS视图控制器初始化问题的更多相关文章
- iOS 视图控制器转场详解
iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...
- iOS视图控制器的生命周期
今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...
- iOS,视图控制器相关(UIViewController)
1.视图控制器各个方法调用时机 2.选项卡(Tab Bar)和导航栏(Navigation Bar) 3.有无控制器的页面跳转 4.页面跳转隐藏底部选项卡 5.获取导航栏和状态栏高度,隐藏导航栏返回按 ...
- iOS 视图控制器转场动画/页面切换效果/跳转动画 学习
一 学习 在 UINavigationController 中 push 和 pop 的转场效果 (基于iOS7 以上的转场方式) 经过学习了解到,重点分三块: (1)pushAnimation: ...
- iOS 视图控制器 (内容根据iOS编程编写)
视图控制器是 UIViewController 类或其子类对象.每个视图控制器都负责管理一个视图层次结构,包括创建视图层级结构中的视图并处理相关用户事件,以及将整个视图层次结构添加到应用窗口. 创建 ...
- iOS(视图控制器转场)
转场需要提供转场代理,不使用默认的代理则需要自己实现代理方式,有UINavigationController.UITabBarController.UIViewController三种代理,实现以下三 ...
- 笔记-iOS 视图控制器转场详解(上)
这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...
- 学习笔记:iOS 视图控制器(UIViewController)剖析
转自:http://www.cnblogs.com/martin1009/archive/2012/06/01/2531136.html 视图控制器在iOS编程中占据非常重要的位置,因此我们一定要掌握 ...
- iOS视图控制器之间delegate传值教程
之前在StackOverFlow上看到一篇讲传值(segue传值和delegate传值)的文章,感觉讲的非常清晰,就将delegate部分翻译了一下.有兴趣能够看看. 原文: http://stack ...
随机推荐
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1159 Solved: 593[Submit] ...
- oracle 分页查询数据重复问题
最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照 ...
- Go实现海量日志收集系统(三)
再次整理了一下这个日志收集系统的框,如下图 这次要实现的代码的整体逻辑为: 完整代码地址为: https://github.com/pythonsite/logagent etcd介绍 高可用的分布式 ...
- Mybatis迷你版--QueryObjectFactory
今天在看JDBC4.2新规范,然后无意之间就碰到了这个东西QueryObjectFactory, 市面上orm框架有很多,在这里我就不一一列举了.那么今天我来记录一下QueryObjectFactor ...
- solr6.6初探之配置篇
一.solr的简介 1) solr是企业级应用的全文检索项目,它是基于Apache Lucence搜索引擎开发出来的用于搜索的应用工程 2) solr最新版本6.6 下载地址:下载地址 二 启动与配置 ...
- Linux 基本概念和操作
我们在使用Linux时,不是直接和系统打交道,而是通过shell的中间程序.在图形界面下为了实现窗口的输入和输出,linux系统为我们提供了终端模拟器Terminal,常见的终端模拟器有 gnome- ...
- Docker学习笔记【三】安装Redis
项目中使用到Redis,平常都是别人搭建的,今天试着在Google Cloud Platform 上搭建一个学习环境. 1.使用 docker pull redis 从docker hub中下载镜像 ...
- 荣耀10带来AI版WPS,玩转潮酷新功能
图书馆里,想把喜欢的句子和情节留存, 无奈摘抄需要时间,拍下来又很容易遗忘在相册? 课堂偷偷拍摄的课件, 模糊一片难以辨认? 开会培训收集的PPT照片, 总有那么几页对焦失败? 这些当时起劲,后来就& ...
- lgp20151222 java中如何将Object类型转换为int类型
if (object instanceof Integer) { Integer.parseInt(object.toString()); } 很简单是不是?我就想提醒下自己,java有个特殊词 ...
- java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet
解决此异常的方法是: 删除您添加在Referenced Libraries 下的catalina.jar包, 然后删除Webapp下的部署程序,重新部署后一切正常. ? --------------- ...