iOS之nib、xib及storyboard的区别及storyboard的加载过程

先讲述下nib, nib是3.0版本以前的产物,在终端下我们可以看到,NIB其实是一个文件夹,里面有可执行的二进制文件;

区分xib和storyboard的区别?

不同点:

1> 无论nib也好,xib也好,最终在执行UIViewController生命周期函数loadView之前,都会转化成可执行的nib文件。

2> storyboard是多个xib文件集合的描述文件,一个xib文件对应着一个视图控制器和多个视图。

  toryboard时,一个工程只需要一个主storyboard文件就可以。

相同点:

1> 是基于xml的描述文件,可以实现可视化编程。

//---------------------------------------------------------------------------------------------------------------------------------------------------------------//

main.storyboard 文件。既然如此,那么storybord又是如何加载的呢?

在创建storyboard apps 时,会自动生成几个默认的文件, AppDelegate.h 便是其中之一。 示意如下:

import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

这些默认生成的文件, 我们要特别关注下, 弄清来龙去脉。 
AppDelegate 继承于 UIResponder,并且拥有一个 UIWindow property。 声明的方式很简洁。 
再打开默认生成的 AppDelegate.m 文件,你会感到很诧异, AppDelegate.m 所展示的代码几乎为空。 所有的method 都是空的。 即使 application:didFinishLaunchingWithOptions: , 仅仅是返回 YES, 也没有其他代码可言。 
这就是说,不管是 AppDelegate.h 还是AppDelegate.m , 都没看到什么玄机。 貌似庞然大物的storyboard,究竟是怎么玩的? 
常言说的好,一个好汉三个帮。 仅仅查看AppDelegate.h/m ,还是远远不够的,  storybord 还有三个好汉


当storyboard apps 启动时, 它怎么知道从哪里加载main.storyboard 文件呢?  秘密就在info.plist上。 

你会看到, UIMainStoryboardFile 或 “Main storyboard file base name” 的键值设为了 Main。

当app 启动时,UIApplicaiton 会自动加载main.storyboard 文件。 同时,会自动加载 main.storyboard  上的第一个视图控制器 (view controller),并且,将该 view controller 所对应的 View 加载到UIWindow 对象中。 
也许你已经注意到了, app 启动时,做了这么的工作,但我们还没有编写一行代码。 storyboard技术的引进,其最大的意义在于, 大大减少与 UI相关的 代码量。


storyboard 帮手:Deployment Info 的设置。  如下:


storyboard 帮手:main.m 文件, 代码如下:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
在main.m 中, 虽然语句不多,但这个语句直接决定了app 的生命周期。 这行代码的作用是,将app delegate class 传给 UIApplicationMain。  

因为整个App 启动和运行的入口,就在UIApplicationMain中。 
以上讲述了 sotroyboard 的加载过程。 不管nib 派还是 storyboard 派,其UIMainWindow的加载原理都是一样的。 

只不过,nib派需要手工编写更多的代码。 明白了这些道理, 即使基于 Xcode5创建工程,你也可以置 main.storyboard 于不顾,

 尽情地游走于自己创建的nib之间。 正所谓“我的nib,我说了算, 想创建多少nib,就创建多少”。 就是这个 Feel, 倍爽。 一天写 1000行代码,轻松任我行。 

 


				
时间: 2024-10-01 12:47:57

iOS之nib、xib及storyboard的区别及storyboard的加载过程的相关文章

IOS 应用程序启动加载过程(从点击图标到界面显示)

今天帮同事解决问题的时候发现,造成程序BUG的原因是同事对程序的启动和试图的加载过程不熟悉.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简单介绍一下启动过程中常见的几个方法.首先我们通过XIB 创建了一个试图控制器(名字叫Empty ,不要问我为为啥它叫这个名字,因为我太懒了,鼠标点快了就没去该),又创建了一个UIView的子类(MyView),并且将Empty的对象 设置为窗口的跟控制器,MyView

document.ready和onload的区别——JavaScript文档加载完成事件

文章转自:http://blog.csdn.net/kk5595/article/details/5713209 页面加载完成有两种事件,一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件),二是onload,指示页 面包含图片等文件在内的所有元素都加载完成.(可以说:ready 在onload 前加载!!!) 我的理解: 一般样式控制的,比如图片大小控制放在onload 里面加载; 而:jS事件触发的方法,可以在ready 里面加载; 更多内容戳这里:http://blog.

IOS中的生命周期及加载过程

这一节,主要讲解UIKit框架下,应用程序的生命周期,UIView的生命周期,异常处理流程及控制器的加载过程. 四大对象关系图 应用程序生命周期 对上面的流程进行说明: 1. 程序启动执行,先进入main函数: int main(int argc, char * argv[]) 2. 执行UIApplicationMain函数: return UIApplicationMain(argc, argv, nil, NSStringFromClass([HKAppDelegate class]));

iOS 设计 用户为王 - 关于征询授权、注册及加载等待的体验优化

你要做的东西一定要是你无比渴望这世界上能出现的东西,这股热情和能量将会融入到你的应用中,成为它腾飞的初速度,为你带来积极反馈.把自己当做app最重要的用户,这一点非常重要. http://www.cocoachina.com/design/20150610/12096.html 作为一名移动app的产品设计师,我(英文原文作者)每周都会下载很多app来试用,看看有哪些细处的交互模式或是惊艳的视觉设计能给自己带来启发.有时,你确实能发现一些app有着不错的想法,但是更多时候,你只觉得失望,因为看到

UIViewController XIB/NIB加载过程

UIViewController中关于nib初始化的函数 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 从这个函数的说明我们可以知道,如果你subclass一个UIViewController,不管有没有使用NIB, [super initWithNibName:bundle]这个方法必须被调用, 这个方法会在如下两种情况下被调用: 显示调用, 指定一个nib名称,系统会去找指定

viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序

viewWillAppear:  Called when the view is about to made visible. Default does nothing视图即将可见时调用.默认情况下不执行任何操作 viewDidAppear: Called when the view has been fully transitioned onto the screen. Default does nothing视图已完全过渡到屏幕上时调用 viewWillDisappear: Called w

IOS开发之XML解析以及下拉刷新上拉加载更多的分享

IOS开发之XML解析 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示XML文件版本, 内部文本使用的编码 <root> 表示根节点 <CityName>北京</CityName>  一个结点, CityName是结点名, 北京结点值 <Item key="1" value="A"></Item>  

DOM加载过程中ready和load的区别

在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有async或defer属性,就暂停解析,开始执行脚本和CSS样式 3. HTML文档解析完成 4. 浏览器等待图片.样式表.字体文件等外部资源加载完成 在这其中,有两个阶段: ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件): load,表示页面包含图片等外部文件在内的所有元素都加载完成. DOM

IOS系统中网络等待的Loading的实现方法 等待加载

镔哥就直接写一个简单的方法吧: 第一种方法: self.title=@"直视行情"; //[self getLodingView]; self.webView =[[UIWebView alloc]initWithFrame:CGRectMake(0, -2, self.view.frame.size.width,self.view.frame.size.height+30)]; [_webView setUserInteractionEnabled:NO]; [_webView se