Xcode - Storyboard_OC版 01:工作原理
前言
1 - Interface Builder:简称 IB,是 Mac OS X 和 iOS 平台下用于设计和测试用户界面的应用程序。它提供了拖放面板可以将控件拖放到屏幕上
2 - XIB 文件,包括视图布局,都是以 XML 格式存储。当程序运行后 XIB ⽂件中的内容被编译为 nib ⽂件存储在工程包中。最初的文件类型是没有 XIB 的,而是叫做 nib,XIB 是从 nib 中衍生过来的,二者并没有本质的区别。一个 XIB 文件可以包含任意数量的对象,而 Storyboard 也是近几年 IB 支持的另一种文件类型
3 - Storyboard 包含多个视图和控制器以及应用运行时进行相互连接的配置信息,和一次就加载完成所有内容的 XIB 文件不同,storyboard 并不会一次加载所有内容,而是在你需要加载某个视图和控制器时指定加载特定内容。在 Xcode 6 中所有 iOS 项目模板都使用了 Storyboard
Storyboard
1 - 新建工程:选择 Single View App Template,它提供了一个类和一个 Storyboard
2 - 在 Storyboard 的 File Inspector 中禁用 Auto Layout ,并拖一个 Label。快捷键 command + shift + L
说明:Storyboard 的样子和工作方式都和 IB 极其相似,唯一不同的地方就是:Storyboard 不止是包含一个视图控件,而是所有的视图控件以及它们之间的联系
Storyboard 对一个视图的官方术语是一个场景,一个场景其实就是一个 ViewController。在 iPhone 中一次只能够展示一个场景,而在 iPad 中一次可以展示多个场景
Dock 是一个文档管理器的缩小版,用来展示场景中第一级的控件。每个场景至少有一个 ViewController 和一个 FirstReponder,但是也可以有其他的控件。Dock 同样可以用来链接控件,如果你需要向目标 ViewController 传递一个关系时,只需要选中 Dock 后按住 Ctrl 键拖到目标上就可以了
FirstResponder 是一个代理控件,代表着当前你所使用的控件
5 - 如果你以前搞过 nib 型的应用,你也许回去寻找 MainWindow.xib ,这个文件包括所有的 ViewController、Appdelegate 等等。但是在 Storyboard 中这个特性已经被废止了。那么问题来了,没有这个文件应用从那里起始呢 ?打开 AppDelegate.h 文件,看看那上面是怎么说的
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow * window; @end
如果要使用 Storyboard 特性,那么 AppDelegate 必须继承 UIResponder;在不使用故事模板时是继承 NSObject,而且必须有一个不是 UIOutlet 型的 Window 属性;如果你再去看 AppDelegate.m 文件,里面大概什么都没有,甚至连 application:didFinishLaunchingWithOptions: 也只是返回了一个 YES。而之前这里则需声明一个 ViewController 并且将它设置成起始页面,但是现在这些都没有了,秘密就在 Info.plist 文件中, 打开 Info.plist 你就会看到这些信息
在 nib 为 UI 的应用程序里 Info.plist 文件中有一个键叫做 NSMainNibFile(或 Main nib file base name)用来指示 UIApplication 载入 MainWindow.xib,并且将它与应用链接起来,而现在这个键值消失了
在 Storyboard 则利用 UIMainStoryboardFile 或 Main storyboard file base name 键值来表示当 App 初始化时的 Storyboard 名称。当程序运行时 UIApplication 会使用 Main.sotryboard 作为第一加载项,并且将它的 UIWindow 展示在屏幕上,不需要任何编程工作
6 - 为了完成这个实验性的小程序,打开 main.m 文件
1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int main(int argc, char * argv[]) { 5 NSString *appDelegateClassName; 6 @autoreleasepool { 7 appDelegateClassName = NSStringFromClass([AppDelegate class]); 8 } 9 return UIApplicationMain(argc, argv, nil, appDelegateClassName); 10 }
注:不使用 Storyboard 时 UIApplicationMain() 的函数是空的, 而现在变成了 NSStringFromClass([AppDelegate class]),与之前使用 MainWindow.xib 的一个最大的不同是 AppDelegate 不再从 nib 文件中调用,而是直接从 Storyboard 中加载,所以必须把 AppDelegate Class 的名字告诉 UIApplicationMain
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)