iOS - UIStoryboard
前言
NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboard : NSObject@available(iOS 5.0, *) public class UIStoryboard : NSObject
StoryBoard 是苹果在 iOS5 中引入的新技术方案,目的是给纷繁复杂的 nib、xib 们一个温暖的家,让他们之间的关系更直观地展示出来,并提供了一种新的页面间跳转方式 Segue。StoryBoard 的本质是一个 XML 文件,描述了若干窗体、组件、Auto Layout 约束等关键信息。Storyboard 不止是包含一个视图控件,而是所有的视图控件以及他们之间的关系。
Storyboard 对一个视图的官方术语是一个场景,但是一个场景其实就是一个 ViewController,用来描述软件界面,在 iPhone 中一次只能够展示一个场景,而在 iPad 中一次可以展示多个场景。一个项目中可以有不止一个 StoryBoard 文件,它们之间可以互相调用。
使用 StoryBoard 的 iOS 项目均以初始化 StoryBoard 文件作为整个程序的初始化入口,UIViewController 类是由于被 StoryBoard 绑定而初始化,从而开始运行的。
1、StoryBoard
1.1 StoryBoard 视图界面
- 加载 StoryBoard 时会首先创建和显示箭头所指的控制器界面。
1.2 Storyboard 到代码的转换
代码编译时编译器会自动将 Storyboard 转换为相应的代码。
- 上图设置自动转换为:
// 创建一个自定义的按钮UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];// 默认状态的文字[btn setTitle:@"点我啊" forState:UIControlStateNormal];// 默认状态的文字颜色[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];// 默认状态的背景[btn setBackgroundImage:[UIImage imageNamed:@"btn_01"] forState:UIControlStateNormal];
2、StoryBoard 界面设置
1)启动 StoryBoard 设置
修改 TARGETS => General => Development Info => Main Interface 的值。或者修改 Info.plist 文件中键 Main storyboard file base name 对应的值可以修改程序启动时加载的 StoryBoard。
这个设置表明:程序启动时会加载 Main.storyboard
2)View Controller 设置
Identity 设置面板
Custom Class . -- Class StoryBoard 绑定的视图控制器 -- Module Identity -- StoryBoard ID StoryBoard 的 ID -- Restoration ID --- Use StoryBoard ID 设置是否使用 StoryBoard ID Attributes 设置面板
Simulated Metrics . -- Size 屏幕尺寸 --- Inferred 自动推断 --- Freeform 自定义 --- Page Sheet --- Form Sheet --- Master 主控制页 --- Detail 详情页 -- Orientation 屏幕方向 --- Portrait 竖屏 --- Landscape 横屏 -- Status Bar 状态栏 -- Top Bar 顶部控制条 -- Bottom Bar 底部控制条 View Controller -- Title --- Is Initial View Controller 设为初始场景,场景前面会显示灰色的小箭头,程序启动后会将这个场景作为应用程序的主屏幕 -- Layout --- Adjust Scroll View Insets --- Hide Bottom Bar on Push 推出新的视图时隐藏底部控制条 --- Resize View From Nib --- Use Full Screen (Deprecated) -- Extend Edges --- Under Top Bars --- Under Bottom Bars --- Under Opaque Bars -- Transition Style 设置页面出现效果 --- Cover Vertical 向上推出 --- Flip Horizontal 水平翻转 --- Cross Dissoive 出现 --- Partial Curl 向上翻页 -- Presentation --- Full Screen --- Current Context --- Page Sheet --- Form Sheet --- Over Full Screen --- Over Current Context ---- Defines Context ---- Provides Context -- Content Size --- Use Preferred Explicit Size
3)View 设置
Attributes 设置面板
View | .
-------------------------------------|---------------------------
|
-- Mode |
-- Tag |
|
-- Interaction |
--- User Interaction Enabled | 用户交互属性
--- Multiple Touch | 多点触控
|
-- Alpha |
-- Background | 背景颜色
-- Tint | 前景颜色
|
-- Drawing |
--- Opaque |
--- Hidden | 隐藏视图
--- Clears Graphics Context |
--- Clip Subviews | 子视图范围不允许超过父视图
--- Autoresize Subviews | 允许子视图随父视图缩放
|
-- Stretching |
3、StoryBoard 关联
3.1 添加控件代码关联
打开 Assistant Editor 同时显示界面设计与代码,按住 Ctrl 键同时拖动控件到代码里,在弹出的上下文菜单中设置需要关联的类型,即可在代码里自动生成代码,这里主要有两种关联类型,一种是 Outlet 连接,就是在代码里创建界面元素的成员变量引用,另一种是 Action 事件,把界面元素的响应事件方法添加到代码里来。如果已经创建了代码,也可以把控件直接拖放到对应代码上,这时候就不是插入而是直接建立连接了。
1) IBAction:
从返回值角度上看,作用相当于 void,只有返回值声明为 IBAction 的方法,才能跟 storyboard 中的控件进行连线。2) IBOutlet:
只有声明为 IBOutlet 的属性,才能跟 storyboard 中的控件进行连线。3) 连线容易出现的问题:
如果遇到这种错误,90% 的可能都是因为连线有问题,比如一些线已经 “过期”。1> 连接的方法代码被删掉,但是连线没有去掉:
unrecognized selector sent to instance 0x7f9bf9610910libc++abi.dylib: terminating with uncaught exception of type NSException
2> 连接的属性代码被删掉,但是连线没有去掉:
'NSUnknownKeyException', reason: '[<ViewController 0x7fdf7048b200> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key
Objective-C
// Outlet 连接@property (weak, nonatomic) IBOutlet UILabel *myLabel;// Action 事件- (IBAction)buttonClick:(UIButton *)sender {}
Swift
// Outlet 连接@IBOutlet weak var myLabel: UILabel!// Action 事件@IBAction func buttonClick(sender: UIButton) {}
3.2 添加 segue 关联
右键(或 control + 鼠标左键)拖动控件到目标场景,在弹出的上下文菜单中选择 show 等。如果是两个 Controller 之间建立包含关联,则上下文之间会有 Relationship Segue 的选项,选择 view controller 即可。
segue 界面关联类型:
Relationship Segue 包含关联 show 导航推出,推出页自带返回按钮 show detail 详情推出 present modally 视图控制器之间跳转 popover presentation 视图控制器之间跳转返回 custom 自定义方式跳转 Objective-C
// 系统自带场景跳转相关方法,可以不写该方法- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {/*segue:场景里跳转的线sender:触发跳转的对象*/// 获取目标视图控制器UIViewController *viewController = segue.destinationViewController;viewController.view.backgroundColor = [UIColor orangeColor];}
Swift
// 系统自带场景跳转相关方法,可以不写该方法override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {/*segue:场景里跳转的线sender:触发跳转的对象*/// 获取目标视图控制器let viewController = segue.destinationViewControllerviewController.view.backgroundColor = UIColor.purpleColor()}
4、StoryBoard 场景跳转
1)创建 按钮 与 Controller 间 segue 关联,无需添加代码,直接点击按钮即可实现页面跳转。
2)创建 Controller 与 Controller 间 segue 关联,并设置 segue 的 Identifier 值,在按钮点击响应事件中添加页面跳转代码。
Objective-C
// 根据 segue Identifier 跳转界面[self performSegueWithIdentifier:@"segueIdentifier" sender:self];
Swift
// 根据 segue Identifier 跳转界面self.performSegueWithIdentifier("segueIdentifier", sender: self)
3)设置要跳转到的 Controller 的 StoryBoard ID,在按钮点击响应事件中添加页面跳转代码。
Name:StoryBoard 文件名称,Identifier:ViewController 中设置的 StoryBoard ID 名称
Objective-C
UIViewController *secondViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"storyboardID"];UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"storyboardID"];[self presentViewController:secondViewController animated:YES completion:nil];
Swift
let secondViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("storyboardID") let secondViewController = self.storyboard!.instantiateViewControllerWithIdentifier("storyboardID") self.presentViewController(secondViewController, animated: true, completion: nil)
4)不同 StoryBoard 文件中,设置要跳转到的 Controller 的 Is Initial View Controller 或者 StoryBoard ID,在按钮点击响应事件中添加页面跳转代码。
若 StoryBoard 中设置了 Is Initial View Controller 可以直接使用 instantiateInitialViewController 初始化,若 StoryBoard 中没有设置 Is Initial View Controller 必须使用 instantiateViewControllerWithIdentifier 初始化。
Objective-C
UIViewController *secondStoryBoardVC = [[UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil] instantiateInitialViewController];UIViewController *secondStoryBoardVC = [[UIStoryboard storyboardWithName:@"secondStoryBoard" bundle:nil] instantiateViewControllerWithIdentifier:@"secondStoryBoard"];[self presentViewController:secondStoryBoardVC animated:YES completion:nil];
Swift
let secondStoryBoardVC = UIStoryboard(name: "secondStoryBoard", bundle: nil).instantiateInitialViewController()!let secondStoryBoardVC = UIStoryboard(name: "secondStoryBoard", bundle: nil).instantiateViewControllerWithIdentifier("secondStoryboardID")self.presentViewController(secondStoryBoardVC, animated: true, completion: nil)
5、StoryBoard 页面传值
1)Segue 传值 - 正反传值
Objective-C
// 系统自带场景跳转相关方法- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// 1、发送方,获取输入框中的数据NSString *msg = _sendTextField.text; UIViewController *vc = segue.destinationViewController;// 2、发送方,发送数据,Key 与接收方设置的接收变量需一致[vc setValue:msg forKey:@"passData"];}// 3、接收方,声明接受数据变量,需与发送方设置的 Key 一致@property(nonatomic, retain)NSString *passData;// 4、接收方,接收数据_receiveLabel.text = _passData;
Swift
// 系统自带场景跳转相关方法override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {// 1、发送方,获取输入框中的数据let msg = sendTextField.textlet vc = segue.destinationViewController // 2、发送方,发送数据,Key 与接收方设置的接收变量需一致vc.setValue(msg, forKey: "passData")}// 3、接收方,声明接受数据变量,需与发送方设置的 Key 一致var passData:String?// 4、接收方,接收数据receiveLabel.text = passData
2)复合传值
- 3)单例传值
4)userDefaults 传值
- 5)代理传值
6)Block/闭包 传值
转载于:https://www.cnblogs.com/QianChia/p/5759358.html
iOS - UIStoryboard相关推荐
- 开源中国iOS客户端学习——(一)Prefix.pch文件
2019独角兽企业重金招聘Python工程师标准>>> 当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以 -Prefix.pch结尾文件的文件,pch ...
- iOS开发之抽屉效果实现
说道抽屉效果在iOS中比较有名的第三方类库就是PPRevealSideViewController.一说到第三方类库就自然而然的想到我们的CocoaPods,今天的博客中用CocoaPods引入PPR ...
- iOS开发之使用XMPPFramework实现即时通信(二)
上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...
- iOS开发那些事-平铺导航–基于分屏导航及案例实现
平铺导航模式是非常重要的导航模式.一般用于简单的扁平化信息浏览或任务.扁平化信息是指这些信息之间没有从属的层次关系,如中国的城市中北京.上 海和哈尔滨之间是扁平化信息,而哈尔滨市与黑龙江省之间的关系是 ...
- IOS之--UI进阶--多控制器管理第一天
01-项目中常见的文件(LaunchScreen) Xcode5框架是苹果事先已经导入进去的.在项目的结构当中就能够看到导入的框架.Xcode6会自动导入一些觉见的框架.在项目结构当中,看不到已经导入 ...
- iOS程序启动过程笔记
CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard) 1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicat ...
- iOS开发那些事-平铺导航-基于Page的导航及案例实现
基于分页导航实现 在iOS 5之后,可以使用分页控制器(UIPageViewController)构建类似于电子书效果的应用,我们称为基于分页的应用.一个分页应用有很多相关的视图控制器 分页控制器(P ...
- iOS对UIViewController生命周期和属性方法的解析
iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...
- iOS之界面传值(通知,属性,协议,NSUserDefaults,KVC)
通知传值 通知是在跳转控制器之间常用的传值代理方式.NSNotificationCenter提供了一种解耦的方式,就是任何对象都可以发送通知到中心,同时任何对象可以监听中心的通知. 发送通知(传值页面 ...
最新文章
- 目标检测--Feature Pyramid Networks for Object Detection
- python与人工智能编程-Python是人工智能和机器学习的最佳编程语言,证据在此!...
- 【arduino】亲测MAC上arduino安装ESP32 SPIFFS插件
- 如何在 Spring 生态中玩转 RocketMQ?
- 使用ASIFormDataRequest打印参数和给项目添加测试账号
- TCP流式套接字的异步事件WSAAsyncSelect编程
- Python:print用法大全
- 国产数据库激荡 40 年
- echart饼状图上显示百分比
- 计算机的ps快捷键,【教程】如何设置ps的快捷键?
- 机器学习:朴素贝叶斯算法对新闻分类
- 阿里云 mysql 创建数据库 账户密码 外网连接等
- Ubuntu20.04微信安装 简单 使用方便
- linux解决依赖性问题
- 人人都懂设计模式--Everybody Know Design Patterns : How to comprehend Design Patterns from daily life
- win11蓝牙无法使用 Windows11蓝牙无法使用的解决方法
- 使用nodejs(ipp和html-pdf-node)实现连接打印机后端静默打印html文件
- 【回忆杀】程序员书房翻杂物,看到初恋的信件,看到奖牌,看到梅西、力宏,他的眼角又湿了.....
- 电路方案分析(十)2 端口 USB 3.0 集线器参考方案设计
- 平板电脑与计算机连接网络,终于发现平板电脑怎么连接网络
热门文章
- 服务端主动推送数据,除了 WebSocket 你还能想到啥?
- 干掉Navicat:这个IDEA的兄弟真香!
- 如何设计一个牛逼的本地缓存
- 西湖大学教授:都说不唯论文,那我们发表论文是为了什么?
- 牛客网_剑指Offer_Python实现_更新中
- 【文末送5本书】与「韦神」齐名,35岁刁晗生任教清华!18岁一战成名,数学界颜值巅峰...
- iPhone 13注定便宜不了,台积电已提前背锅
- 我们常称自己“码农”,这次已得到官方认定:“新生代农民工!
- 再也不用担心过拟合的问题了
- GPT-3获NeurIPS 2020最佳论文奖