IOS APP开发中View的几种实现方式
xib文件有以下几个重要的属性:
xib文件名
File’s Owner
xib文件中的视图的Class
xib文件中的视图的Outlet指向
File’s Owner 可以关联到某类,然后通过IBOutlet 可以提供视图中各种逻辑
自定义视图类,xib中设置布局,类中实现逻辑
纯代码实现


Xib文件
File’s Owner为nil的xib
新建BlueView.xib, 由于它会放到其它View上作为subview,所以这儿size是Freeform, Status Bar是:None


完成布局:


结论:
File’s Owner为nil的xib文件中的视图属于通用视图,在工程中可以复用
从xib加载进来的View在父视图中的位置是不确定的,因此需要开发者自行指定
视图中的所有子视图会被原封不动地Load进来
File’s Owner为self的xib
以与上例相同的方式创建GreenView.xib


加载File’s Owner为self的 view当然也可以用上一例的方法,但也可以更简单

结论:
File’s Owner不为nil的xib文件中的视图属于专用视图,在工程中不应该被复用
只要self主动调用loadNibNamed方法,self持有的IBOutlet指向的视图就会被初始化
存取xib中的视图用不着views[0]的方式,可以通过IBOutlet类型的property进行存取
File’s Owner为特定类的xib
原理与上面3说的一样的,只不过这儿我们特别定义一个NSObject的子类来作为xib的Owner, 要所有需要关系的view都可以声明在这个Owner中,这样方便代码管理与维护。


结论:
File’s Owner类可以封装视图中的各种逻辑,而不仅仅是提供视图内容
只要通过File’s Owner类主动调用loadNibNamed方法,该IBOutlet指向的视图就会被初始化
加载xib中文件名和视图类名一致的视图
在UIView的子类中通过IBOutlet提供下级xib的逻辑




通过UIViewController的initWithNibName:bundle:方法加载xib文件中的视图
initWithNibName方法与 initWithNibName方法的对比

右键点击"Files's Owner", 里面有个默认的IBOutlet变量view, 看一下后面有没有做关联,如果没有就用左键拉到下面的View和视图做个关联

这样在initWithNibName时会自动修改view的值,否则会因为view没值而报错


结论:
将xib的File’s Owner设成一个UIViewController子类,可以将这个xib文件的视图展示和外部响应事件(例如点击一个按钮触发的点击事件,该视图的手势事件等)全部封装在一个View Controller中,如果把按钮的点击事件封装在一个UIView类中,貌似破坏了MVC模式,因此最好将xib的File’s Owner设成一个UIViewController子类,该类可以通过addChildViewController方法将其添加到现有的View Controller上。如果只是希望加载视图,可以通过viewcontroller.view存取。
通过UIViewController+NIB加载xib文件中的View Controller类和其视图
如果希望ViewController A加载并响应a XIBView中的按钮点击事件,这时必须建立一个a XIBView到ViewController A的IBAction,如果ViewController A需要拥有多个这样的XIB,那么ViewController A会变得非常的庞大,此时可以通过为每一个XIB设置一个ViewController,再让ViewController A加载这些Child View Controllers,这样可以将这些事件的响应职责和视图的描绘工作分派给专门的Child View Controller,在减小ViewController A体积的同时,也可以提高各个xib的可复用性。



总结
通用的xib
- 如果xib只是单纯的界面展示,那么File’s Owner可以随意。
- 如果xib中包含了按钮、手势等用户输入事件,那么File’s Owner最好设置为UIViewController类的子类。
补充:
NSBundle.mainBundle().loadNibNamed("RedView", owner: redViewOwner, options: nil) 返回的是一个数组
因为xib中可以有多个视图控件,从xib中load出来的views数组中视图对象的排列顺序和xib scene中的对象排列顺序一致(其实就是xml文件中元素的排序而已)

在写界面时同时混用xib和代码可以提高效率,而对xib的使用主要体现在其专用性和通用性上。
- 对于一些专门的界面,例如App中的设置界面,纯代码写难免会浪费时间,此时可以通过xib文件的拖控件方法来定制。这个xib是专用于某一个界面的,目的是提高效率。
- 对于一些通用的控件甚至界面,例如一个很漂亮但实现起来非常复杂的按钮,此时可以通过load xib文件中的视图来快速添加。这个xib对于所有视图是共用的,目的是提高可复用性。
- 同时也可以混搭使用故事版,因为故事板可以方便地管理页面,如果几个页面间的关系很稳定,不会乱跳转的话,可以部分地使用故事版,然后在代码中调用故事版就是了
代码手写UI
优点:
可以专注于编码环境
版本管理时的优势,检查追踪改动以及进行代码合并相对容易一些
代码重用性,优化
缺点:
不到运行时大家都不知道会是什么样子
开发速度慢。相比可视化的IB来说,代码量大量增多,也就更容易出现bug
维护时代码定位和寻找相对不方便
可视化布局(xib,StoryBoard)
优缺点略
可以把StoryBoard看做是一组viewController对应的xib,以及它们之间的转换方式的集合。
最大的优势就是一般可以加快速度,特别事自动布局优势明显
技巧:
1. 在一组view层次中进行选择
按住Cmd和Shift,然后在需要选择的view上方按右键,就可以列出在点击位置上所有的view的列表
从xib中加载view的执行步骤
先调用init(coder aDecoder: NSCoder)(从xml文件中加载view),
之后调用awakeFromNib()(当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作),
然后是layoutSubviews()(只有在这里frame的值才是正确的值,所以从xib中加载view时,前两个方法里只适合创建下级view对象,只有在本方法里才能去定位下级view)


IOS APP开发中View的几种实现方式的更多相关文章
- Android 开发:view的几种布局方式及实践
View的几种布局显示方法,以后就不会在针对布局方面做过多的介绍.View的布局显示方式有下面几种:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Tab ...
- ios app 开发中ipa重新签名步骤介绍-备
作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要将安装包安装到ios机器上进行测试,这个时候我们就需要打包in house版本的ipa了,打包in house实际上是一个将ipa应 ...
- ios app 开发中ipa重新签名步骤介绍
作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要将安装包安装到ios机器上进行测试,这个时候我们就需要打包in house版本的ipa了,打包in house实际上是一个将ipa应 ...
- iOS App开发的那些事儿2:如何搭建合适的框架
<iOS App开发的那些事儿>系列文章从更宏观的角度出发,不仅仅局限于具体某个功能.界面的实现,而是结合网易云信iOS端研发负责人多年的经验,从如何优化现有代码的角度出发,深度分析如何创 ...
- iOS App开发的那些事儿1:如何建立合适的规范
<iOS App开发的那些事儿>系列文章从更宏观的角度出发,不仅仅局限于具体某个功能.界面的实现,而是结合网易云信iOS端研发负责人多年的经验,从如何优化现有代码的角度出发,深度分析如何创 ...
- iOS9中找不到XXX.dylib 与 is unavailable no availabel on ios (app extension) - use view controller 的解决办法
在 iOS9 中现在找不到 XXX.dylib 了,比如libz.tbd 如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow. Go to Build Phase ...
- iOS App开发那些事:如何选择合适的人、规范和框架?
http://www.cocoachina.com/ios/20141202/10386.html 自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实 ...
- 20个可以帮你简化iOS app开发流程的工具
这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是 ...
- app开发中如何利用sessionId来实现服务端与客户端保持回话
app开发中如何利用sessionId来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...
随机推荐
- 洛谷U4807抽水机[最小生成树]
题目背景 kkk被Farmer John和他的奶牛贝茜虐的很惨,然后她也想体验下一个Farmer的生活.但她又懒得种地,就选择养鱼. 题目描述 这些鱼都是热带鱼(废话),很娇贵(比kkk娇贵),要经常 ...
- POJ3187Backward Digit Sums[杨辉三角]
Backward Digit Sums Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6350 Accepted: 36 ...
- 分层开发之MySchool
No.1实现登陆功能,验证用户名和密码.从数据库里进行匹配,看是否有符合要求的数据. 在DAL层编写代码,返回值为布尔类型.方法参数为(student实体类对象),使用参数化SqlParameter类 ...
- JDK-Logger
log4j的作者Ceki Gülcü在停止维护log4j后开始新的日志组件的开发,他的新作为日志门面slf4j以及log4j的替代品logback.不过logback至今还没有出1.0的正式版,所以使 ...
- 给VIM安装插件。让ubuntu的vim强大起来
简易安装方法: 打开终端,执行下面的命令就自动安装好了: wget https://raw.github.com/ma6174/vim/master/setup.sh -O ma6174_vim_se ...
- hibernate考试题
1.在Hibernate中,以下关于主键生成器说法错误的是(C). A.increment可以用于类型为long.short或byte的主键 long,short,byte都是特殊的int类型 B.i ...
- Android开发书籍推荐:从入门到精通系列学习路线书籍介绍
Android开发书籍推荐:从入门到精通系列学习路线书籍介绍 很多时候我们都会不断收到新手的提问"Android开发的经典入门教材和学习路线?"."Android 开发入 ...
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
问题描述:前端同事使用Vue.js框架,利用vue-route结合webpack编写了一个单页路由项目,运维协助在服务器端配置nginx.部署完成后,访问首页没问题,从首页里打开二级页面没问题,但是所 ...
- 泛型中? super T和? extends T的区别
原文出处: 并发编程网 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T ...
- PHPExcel
1.PHPExcel类中读取Excel文件相关函数和使用方法 插件官网:http://phpexcel.codeplex.com/ <?php require_once 'Classes/PHP ...