ios开发与桌面开发的很大不同在于:单窗口(对于单个屏幕而言),程序员绝大部分时间操作的对象是View和对应的Controller,此外对于移动设备,还要考虑过渡效果。
与桌面软件不同,app的绝大部分数据被存放在controller中,此外,controller还要承担过渡效果;app的view是直接接受用户点击等事件的类。因此,overrrode相关view类的响应时间方法就可以custom自己的view。事件触发之后,将相应的消息传送给controller,由controller进行数据的处理,改变view的外观,以及与数据库、服务器进行通信(本节暂时不介绍这方面内容)。
最常用的view controller就是navigation view controller 以及tab bar controller,对于view,比较方便的是使用现有的模版storyboard。以navigation view controller为例,它是一个container view controller,顾名思义,navigation view controller可以容纳多个view controller。整体上,view controller分为container view controller 和 content view controller, 前者可以认为是controller 树的非叶子节点,后者是显示具体内容如:图像,邮件,text等的直接与用户打交道的叶子节点controller。navigation view controller 包含了多个view以及它们各自对应的view controller,每一个view在assembled views中都有以一个navigation view item与之对应,并且具体的外观细节可以用代码修改,如下图1A所示。
建立一个简单的app程序:
首先,要理解window只是一个虚的概念,我们能见到的都是一些view的集合,内部类的关系如下图:
每一个“控件”都是一个view,都有自己的controller,并可以进行深度的自定义。你看到的是一个view的集合,内部是一个树形的结构,因此有一个root view controller,它控制了其他所有的view以及controller,
在xcode中,建立一个项目,选择empty application,创建后,它会自动生成一个代理类,关于这个类,会在下一节介绍。运行后,是一个空白的屏幕,因为我们的app中还没有任何view controller 和view,为了添加view,我们新建一个类。new->file->object class,选择继承自UIViewController,名字自拟,并勾选With Xib for User Interface,这里,xib'是一个xml文件,它定义了view的原始外观(因为动态的内容和运行后的改变在代码中实现),这也是一种当下很流行的界面开发模式。
创建controller类之后,使用Interface Builder可以发现,已经出现了一个View类,但是我们看不到这个类的定义和实现代码,它就是刚刚创建的controller的view,是系统自动生成的,界面上它填满了整个window区域。右击File Owner或或者View都可以看到他们的关联关系,对于View在弹出的黑色窗口(Outlet)中,我们看到了一个view和View之间的连线,这个代表了界面元素和类之间的关联关系,view代表了controller中的view成员,View指的是界面中的View元素,Outlet亦可以在右边侧边栏中用拖拽的方式使用,以关联界面元素和定义的类或成员。
在右侧的侧边栏,上面可以定义界面的各种属性,下面可以选择界面控件库中的各种元素。下面要做的是将Controller联系到delegate中去,打开AppDelegate.m文件,new一个我们定义好的Controller类,(以下用MyViewController代表)。
MyViewController* myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[self.window setRootViewController: myViewController];
第一句的作用是new并且用xib文件初始化一个Controller对象,这里引入了界面文件传给这个RootViewController,然后下一句将它设置为RootViewController。
向View中添加若干库中的元素,然后编译,运行,OK~