iOS中的 SB和XIB的前世今生
今天给大家介绍一下Apple开发中三种几种常用的应用程序编写方式:纯代码创建、使用storyboard/XIB。我们都知道,纯代码编写模式适合大型项目大规模使用,利于版本管理、追踪改动以及代码合并,代码重用性强,代码后期维护方便快捷。但是我们不能否认它开发周期长,代码结构复杂,自动布局AutoLayout困难等缺点,
一、Interface Builder介绍
1、概念
Interface Builder苹果平台下用于设计和测试用户界面的应用程序,简称IB。简单理解,IB就是提供可视化设计环境。
Interface Builder,是用于苹果公司 Mac OS X 操作系统的软件开发程序,Xcode 套件的一部分
Interface Builde :是可视化创建界面描述文件的工具,打开xib可以看到xml的文件结构
Xcode.3.0 之前 Interface Build 创建的文件是二进制nib nib代表Next interface Builder 因为nib是二进制不好管理 也不方便版本控制xcode.3.0 之后 interface builder 使用了一种新的文件格式xib xib的意思是XML interface builder, xib 使用了XML 在工程编译的时候在转换成nib
xcode 4.0 之前 interface Builde 是一个独立软件, 而Xcode 4.0 是个大版本 界面被重新设计 interface Builder 被直接集成到xcode
注意点: 当我们用xib 会遇到 xib 添加到控制器view 中有时程序会崩溃
错误提示: unrecognized selector sent to instance 0x7ffae1c1b680'
这时我们应注意xib里控件有几个 ,我们加载xib 会以数组的形式加载 xib对象是按照方进去的顺序排列的
2、作用及特点
IB给用户提供了可视化的操作界面,可以很方便并且直观的设计出用户界面元素。IB提供的拖放面板,使用拖拽就可以方便的构建出UI界面。使用IB是可选的,因为所有控件都可以使用代码来实现。
3、集成
Interface Builder工具是在iPhone SDK中提供的,应用于Mac OC 和iOS应用开发,从Xcode4开始,集成到了其中(之前是独立的软件)。
4、Nib元素
(1) Nib文件是保存由Interface Builder创建的对象及对象间关系的一种资源文档,Nib 是 NeXT Interface Builder的缩写。
(2)早期,IB使用Nib文件存储控件资源,Nib本身是二进制文件。
5、Xib的出现
(1)自从Xcode 3.0 开始,苹果提供Xib文件构建UI元素,本质是XML文本文件,可以很方便的编辑。同时Xib可以编译为Nib。
(2)Nib 和 Xib都是 Interface Builder 的图形界面设计文档。
二、xib介绍
1、简介
(1)IB和xib是从iOS SDK初次面世开始就是捆绑在开发者工具套装内的内容了(独立),而到了Xcode 4之后更被直接集成到了Xcode中成为了IDE的一部分。
(2)Xib是XML格式的文件。
(3)UIViewController生命周期函数loadView之前,Xib会转化成可执行的nib文件
2、使用
(1)通过xib加载控件
<1>loadNibNamed 方法
(2)通过xib加载控制器
<1>initWithNibName: bundle:方法 (如果xib和控制器名字相同或近似,可以不用实例化)
<2>设置xib的身份检查器中的关联
<3>设置File's Owner ,拖动到View上
3、优势
(1)相比纯代码,大大缩短了UI界面搭建的时间,提高了开发效率。
(2)可视化的效果,更直观的设计
(3)在版本管理上和纯代码的差异并不是很大,易读易维护。
4、问题
(1)Xib无法进行逻辑判断。
(2)很难在运行时进行配置,Xib在使用时,经常要通过代码的补充,来完成功能实现。
(3)多人开发中通过代码修改Xib的属性,可能造成混乱和不可预计的问题。
(4)从程序员角度,可读性较差。不利于统一管理和维护。使用SVN等代码管理工具时,Xib会产生无用的记录,以及版本更新的缺陷。从Xcode5开始,苹果对这一方面问题进行了优化,比如在版本管理上,也可以很好的查找修改记录了。
(5) xib中的设置往往并非最终设置,UI设计会被代码所覆盖
(如果选择xib,那么要尽量将xib的工作和代码的工作隔离开来:能够使用xib完成的内容就统一使用xib来做,而不要说三个Label其中两个在 xib设置了字体而另一个却在代码中完成。尽量仅保持必要的、较少的IBOutlet和IBAction会是一个好方法。)
6、几个和Xib相关的方法
(1)loadNibNamed: owner: options 加载Xib控件
(2)aweakFromNib 通过Xib加载控件,会调用关联类中的此方法
(3)initWithCoder 通过Xib加载控件,会调用关联类中的此方法
三、storyBoard
1、 简介
iOS5版本后,苹果公司推出Storyboard,目前新创建工程时默认自带Storyboard,可以说StoryBoard是未来的趋势.
1.什么是Storyboard?
我们从字面可以理解为 故事板 Storyboard的是 ios5 的新特征 目的是代替历史悠久的xib
Storyboard 是多个xib文件集合的描述文件,也采用xml格式
如果要使用Storyboard特性,那么AppDelegate必须继承自UIResponder类, 之前则是继承自NSObject类的,而且必须有一个不是UIOutlet类的Window属性声明才可以
注意点: 当我们需要更换Stoard 我们需要把infor.plist Main interface 里的东西 删除 否则会报错
2、特点
(1)提供页面间新的挑战方式:segue
(2)描述了若干窗体、组件、Auto Layout 约束等关键信息。
(3)默认storyBoard作为程序的主入口
(4)Auto Layout 跟 StoryBoard 的配合使用,可以大幅提高 UI 开发效率,并准确提供出各控件的位置和约束。
(5)storyBoard中是展现控制器之间的关系。
3、优势
(1)storyboard在IOS5引入,是xib集合的描述文件,本身也是xml格式;提供了nib 和 xib 的集中管理,更直观的展现出他们的关系。
(2)提高UI设计效率的同时,通过可视化界面,可以很清晰的反映出控制器之间的跳转关系。
(3)在storyBoard中可以提供简单的页面跳转,拖拽就可以设置成功。
(4)UI设计中可以实时直观的反映设计效果,由于代码量较少,所以,bug产生的几率也较低(代码实现UI需要大量代码)。
(6)代码量少,开发周期短
(7)是新建项目时候的默认配置,代表着苹果以后的方向和重心将倾向于可视化编程。
4、使用
(1)通过storyBoard加载控制器
<1> 创建UIStoryboard 对象: storyboardWithName:
<2> 通过storyBoard对象创建
instantiateInitialViewController;
instantiateViewControllerWithIdentifier;
(2)通过storyBoard加载视图,
<1> 在Prototype cells 中设置样式,和reusedID,可以实现cell重用。
<2> collection中的item注册,也可以通过Prototype cells
5、问题
(1)存在Xib设计中相同的一些问题,比如维护的不方便,多人开发的不便利,没有逻辑判断等等。
(2)最大问题就是多人协作开发,UI控件都在一个storyBoard文件中。
(3)因为是多个Xib,多以会更大一些,加载会慢一些。
(4)由于没有使用代码设计控件,所以重用问题不灵活。
四、xib 和 Storyboard 的区别
共同点 : 都用来描述软件的界面 都用Interface Buile工具编译
不同点 :(1)xib是轻量级 用来描述局部的UI界面;而Storyboard 是重量级 用来描述整个软件的多个界面 并且 能展示多个界面之间的跳转关系
(2) storyboard是多个xib文件集合的描述文件,也采用xml格式。一个工程中可以有多个xib文件,一个xib文件对应着一个视图控制器和多个视图。而使用storyboard时,一个工程只需要一个主storyboard文件就可以了。因此,在包含多个视图控制器的情况下,采用storyboard管理比较方便,而且storyboard还可以描述界面之间的导航关系。
五、使用storyboard的注意点。
使用Storyboard需注意:
1、如果要使用Storyboard特性,那么AppDelegate必须继承自UIResponder类, 之前则是继承自NSObject类的,而且必须有一个不是UIOutlet类的Window属性声明才可以
2、StoryBoard专有的preview功能,以及AutoLayout的功能。
3、StoryBoard中已经不允许有单个view的存在
六、简述XIB和storyboard的使用方法。
xib使用过程:
1. 首先使用interface builder 新建一个uiview的.xib文件。
2. 向新建的uiview的.xib文件添加需要的控件。
3. 定义一个继承自uiview的派生类。将上面新建的xib文件的派生类改为新定义的继承自uiview的派生类。
4. 将在xib文件上添加的控件与继承自uiview的派生类建立连接IBOoutlet。
5. 在需要生成uiview的地方添加一下代码:
NSArray* nibView = [[NSBundlemainBundle] loadNibNamed:@"xib文件名字"owner:nil options:nil];
UIView * backupSearchView = [nibView lastObject];
storyboard使用过程:
// 1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建控制器[storyboard故事板]
// 2.1 先加载故事板文件
UIStoryboard *boss = [UIStoryboard storyboardWithName:@"CZBoss" bundle:nil];
// 2.2 实例化初始化控制器[带箭头]
// UIViewController *vc = [boss instantiateInitialViewController];
//根据表示符,实例化控制器
UIViewController *vc = [boss instantiateViewControllerWithIdentifier:@"blue"];
// 3.设置窗口的根控制器
self.window.rootViewController = vc;
// 4.把窗口作为主窗口并可见
[self.window makeKeyAndVisible];
参考资料:http://news.cnblogs.com/n/124292/
iOS中的 SB和XIB的前世今生的更多相关文章
- ios 中实现storyboard 与xib 之间的切换
1,跳转到xib 假设有一个按钮,这个按钮就是实现跳转的,那么在这个按钮的点击事件中,代码可以这样写. AViewController *a1= [[AViewController alloc]ini ...
- ios中xib的使用介绍
ios中Xib的使用 ios中xib的使用 Nib files are the quintessential(典型的) resource type used to create iOS and Mac ...
- iOS中xib与storyboard原理,与Android界面布局的异同
用文本标记语言来进行布局,用的最多的应该是HTML语言.HTML能够理解为有一组特殊标记的XML语言. 一.iOS中xib与storyboard显示原理 在iOS中基本的布置界面的方式有3种:代码.x ...
- IOS中 类扩展 xib
一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...
- iOS:iOS中的多控制器管理
iOS中的控制器有三种创建方式: 1.通过storyboard创建 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@" ...
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文 ...
- iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)
iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath 首先分析有几种原因,以及相应的解决方法 1.UITableViewCell的userInterac ...
- iOS中使用Localizable.strings适配App在不同语言下文本的显示
iOS开发中,若是使用xib或storyboard搭建界面视图,视图中固定显示的文本内容可以用localized添加不同语言适配.但是在实际中会有动态加载的文本,这些文字的适配就需要NSLocaliz ...
- 在iOS中获取UIView的所有层级结构 相关
在iOS中获取UIView的所有层级结构 应用场景 在实际 iOS 开发中,很多时候都需要知道某个 UI 控件中包含哪些子控件,并且分清楚它们的层级结构和自个的 frame 以及 bounds ,以便 ...
随机推荐
- Android Studio 解决方法No JVM installation found. Please install a 64-bit JDK.
————————— Error launching Android Studio ————————— No JVM installation found. Please install a 64-bi ...
- break在switch中的使用例子
/* Name:break在switch中的使用例子 Copyright: By.不懂网络 Author: Yangbin Date:2014年2月21日 03:16:52 Description:以 ...
- Java 初始化的个人理解
先说明一下由来吧,下面是同学的一道笔试题,以前感觉对java初始化也是了解一二的,结果,看到这题泪奔了,不会...上网查,自己添加println,总算是能把自己讲明吧了,不知理解的对不对,先记录下吧, ...
- 直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)
在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法. ...
- Visual Studio 中用管理员权限运行、调试程序
原文:Visual Studio 中用管理员权限运行.调试程序 一个Sample小程序,用于验证WoW64的Windows Registry的读写访问.在Visual Studio 2010中调试运行 ...
- 关于 overridePendingTransition()使用
实现两个 Activity 切换时的动画.在Activity中使用有两个参数:进入动画和出去的动画. 注意1.必须在 StartActivity() 或 finish() 之后立即调用.2.而且在 ...
- RedisService
package com.sprucetec.bone.common.redis;import com.alibaba.fastjson.JSON;import org.springframework. ...
- cocos2dx CCEditBox
CCTextFieldTTF是一个简单的封装,用起来不是那么便利,在cocos2dx的extension里,对输入框有更加简单使用的类,那就是CCEditBox 上代码先: bool EditBox0 ...
- 脑波设备mindwave二次开发框架
神念科技提供的mindwave提供了脑波耳机和相应的游戏,这些游戏你可以通过购买神念科技的mindwave耳机来获取,这里不多作介绍. 我们作为程序员,如果有了相应的创意,也可以通过他们提供的二次开发 ...
- solaris 操作系统配置联网
1. 设置主机名: etc/hostname.vmxnet0 hannick 2.设置主机名和ip地址的映射: etc/hosts 127.0.0.1 localhost 192.108.1.123 ...