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来实现服务端与客户端保持回话 这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: ...
随机推荐
- HDU4003Find Metal Mineral[树形DP 分组背包]
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- MYSQL基础知识总结
!注释方式 # -- 单行 /* */ 多行 1.SELECT column1,column2,column3 FROM tablename WHERE id <= 5 ...
- hibernate考试题
1.在Hibernate中,以下关于主键生成器说法错误的是(C). A.increment可以用于类型为long.short或byte的主键 long,short,byte都是特殊的int类型 B.i ...
- luogu[1135]奇怪的电梯
题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N).电梯只有四个按钮:开 ...
- MySQL Index详解
FROM:http://blog.csdn.net/tianmo2010/article/details/7930482 ①MySQL Index 一.SHOW INDEX会返回以下字段 1.Tabl ...
- 003商城项目:数据库的创建以及ssm框架的整合
我们创建一个数据库.如下: 然后开始整合框架: 先给出整合框架的思路: 我们的Dao层用的是Mybatis,其实Mybatis与Spring整合要做的就是把他的数据库连接这部分全部交给Spring来 ...
- 利用 Html 元标记控制搜索引擎蜘蛛
摘要:快照不被百度缓存: meta name = Baiduspider content = noarchive 所有搜索引擎,抓取这个页面.爬行链接.禁止快照: meta name = robots ...
- word里的代码格式,使之有底纹的效果
实现效果: 怎么才能在word里实现这样的显示? 如何设置word里的代码格式,使之有底纹的效果
- JAVA反射其实就是那么一回事
概念:什么是反射 java反射机制: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及 ...
- AngularJS中实现无限级联动菜单(使用demo)
昨天没来得及贴几个使用demo,今天补上,供有兴趣的同学参考 :) 1. 同步加载子选项demo2. 异步加载子选项demo3. 初始值回填demo4. 倒金字塔依赖demo directive的源代 ...