《iOS开发之美》节选: 谈谈 xib 与 storyboard的关系
来源:互联网 发布:linux echo 打印变量 编辑:程序博客网 时间:2024/06/05 17:51
http://leopard168.blog.163.com/blog/static/1684718442014183256520/http://leopard168.blog.163.com/blog/static/1684718442014183256520/
掐指一算, apple 推出 storybord 框架 已有2个年头。 很多时日过去了, storyboard 使用者也与日俱增,之前的争议之声,渐渐销声匿迹了。 正所谓沉默也是一种无声的抗议,不妨将这种对抗成为两大阵营,或者说是 iOS江湖两派: nib apps VS. storyboard apps
纵观iOS发展历程, 不管是哪种技术,都有其历史的必然性,最终总会被一种新技术所取代。 apple 一直在引领科技的潮流,立足于浪潮之巅。
nib apps 代表了 iOS的过去, 而 storyboard apps 代表了iOS的现在和未来。 作为iOS开发者,我们既要脚踏实地,不忘过去,同时也得仰望星空,不断地自我创新。
1. nib apps 的回顾
nib apps 中,有一个必不可少的文件: MainWindow.xib 。 app运行时,呈现在你面前的第一个画面,就是UIWindow 对象。 而UIWindows 就是包含在 MainWindow.xib 中。
具体来讲, MainWindow.xib ,UIWindow, App Delegate,root view controller ,这四者是密切关联的。 我们要理解这四者之间的关系,方能更好地明白 storyboard apps 的运行机制。
2. storyboard apps 运行逻辑图
在storybord apps 中, MainWindow.xib 是不存在的。 取而代之的是 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 帮手: info.plist 文件。 如下:
当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 的设置。 如下:
点击 Project settings, 可以看到Deployment Info。 你会注意到, Main Interface 也设为了 Main。 其实,这里的 Main 所指的就是 main.storyboard。
为了彻底理解 storyboard 的加载过程, 我们再来打探另一个重要的帮手。
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行代码,轻松任我行。
- 《iOS开发之美》节选: 谈谈 xib 与 storyboard的关系
- IOS开发:xib和storyboard的混用
- 大钟的ios开发之旅(1)————简单谈谈ios程序界面实现的三种方式(代码创建,xib和storyboard)
- IOS StoryBoard与xib互调
- [讨论]iOS 开发之使用XIB/StoryBoard 和 使用代码
- iOS学习3_UI开发之纯代码/storyboard/xib
- IOS中UI开发之:xib/storyboard or 手写代码
- iOS xib 与StoryBoard 之间的互相,以及StoryBoard与StoryBoard之间跳转
- iOS之nib、xib及storyboard的区别
- iOS之nib、xib及storyboard的区别
- IOS开发Xcode5将storyboard换成xib
- iOS 开发 nib , xib, storyboard 区别
- iOS开发之xib或storyboard上给UIScrollView添加子控件约束报错的问题
- iOS之美: UIView 与 UIWindow之间的关系
- IOS, xib和storyboard的混用
- IOS, xib和storyboard的混用
- IOS, xib和storyboard的混用
- IOS中storyboard和xib的区别
- Elasticsearch-PHP 安装
- linux 显示所在项目当前分支及git状态
- 基于SlidePanelLayout实现ResideMenu
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
- Android开发总结笔记 LinearLayout(线性布局) 1-1-1
- 《iOS开发之美》节选: 谈谈 xib 与 storyboard的关系
- HttpServlet cannot be resolved to a type
- 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)
- matlab | 与 || 的区别
- 接收和发送短信
- !!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
- UDK光照贴图教程
- XcodeGhost简单查看
- 两个电解电容反相串联作用和用途