iOS探索--iOS初探知识点总结

来源:互联网 发布:怎么样做淘宝生意 编辑:程序博客网 时间:2024/06/05 18:05

一、开端
这篇文章我们来演示新建第一个iOS项目能了解到那些知识点。开端当然是我们全世界通用的惯例Hello World。

二、创建Hello World
用xcode创建一个Hello World程序:
这里写图片描述
点击Next:
这里写图片描述
点击Next:
这里写图片描述
程序到这里就创建完成了。接下来我们创新一个UILable,用于展示Hello World。UILable类似于android中的TextView,创建控件有俩种方式,一种是拖控件,一种是在代码中编写。下面我们采用在代码中编写来实现。这里的入口是在根控制器ViewController类:
这里写图片描述
我们一般在这里初始化一个View。这个入口类似于android中的Activity的onCreate方法。代码中显示的”+”和”-“,是方法类型标识符,其中”+”代表该方法是类方法,直接用类名调用即可,”-“是实例方法,必须用对象才能调用。
这里写图片描述
点击左上角运行按钮,运行完毕如下:
这里写图片描述
三、知识点分析
1、程序的入口和声明周期
我们在开发Android程序的时候都知道其实一个应用程序的入口并不是MainActivity的onCreate方法也不是Application的onCreate方法,而是ActivityThread的main方法,与之类似,在iOS中一个程序的入口也是main方法,而这个main类在main方法中:
这里写图片描述
每个程序都有一个main.m这个类,内部有一个main方法,而这个方法我们看到C语言中的main函数形式是一致的,这就是入口,那么这里有一个作用就是托付应用程序的代理对象AppDelegate类,也就是把整个应用程序的逻辑都托付给了AppDelegate类,在iOS中这种方式叫做代理,而在Android中我们通常叫做回调机制,然后UIApplicationMain类就会和AppDelegate类进行交互,比如应用的生命周期,事件处理等,从代码上看下AppDelegate类:
这里写图片描述
2、应用的展示窗口
上面就介绍完了iOS程序的生命周期相关的类AppDelegate,下面还需要继续分析,怎么关联上ViewController类的,把HelloWorld展示出来的?首先我们在程序启动完成之后的回调方法中打印一个日志,把当前应用的跟控制器打印出来:
这里写图片描述
Log展示:
这里写图片描述
打印日志一般用NSLog(),NSLog()是Fundation提供的一个输出函数,该输出函数的功能非常强大,不仅可以输出对象,还可以输出字符串。OC语言要求在引号前添加@符号,用于与C语言的字符串进行区分。OC语言也是一门编译型语言,早期版本使用GCC来编译OC程序,从Xcode4开始,Xcode使用LLVM3编译,LLVM3比GCC更快,而且可以提供更友好、更精确的报错信息。

当一个应用启动后,从上面运行的log中可以看到,有哪些生命周期的回调方法会执行,同时看到了根控制器就是我们上面添加HelloWorld控件的入口ViewController类对象。那么这里就引出了两个对象:一个是self.window对象,一个是window.rootViewController对象。下面先来看看self.window这个对象了,其实这个对象是一个UIWindow类型。和Android一样,一个程序就对应一个窗口是后续展示View的基础。
通常一个应用就对应一个UIWindow,就是应用的窗口。它是后续展示View的基石,如果没有了这个UIWindow,那么应用所有的UI都展示不出来,其实UIWindow是一个特殊的View,他继承了UIView类的,也是可以直接添加View控件的以及你可以像使用View那样去操作它。
虽然一个应用只能有一个UIWindow,但是我们可以定义多个UIWindow,然后设置指定的UIWindow为主窗口。如果想让哪个窗口成为主窗口并且展示,调用makeKeyAndVisible方法就可以了。
3.应用的控制器
UIViewController类,用于控制View的展示功能,他是一个应用中每个页面的载体,在iOS中UIViewController类就相当于Android中的Activity,在Android中一个程序都有一个默认或者是主Activity,在iOS中也是一样,有一个根控制器,而这个根控制器就是需要设置到应用的唯一窗口中,也就是UIWindow的rootViewController属性值。关于控制器也有一些生命周期方法,用的最多也是最主要的一个就是View加载完成之后的方法:
- (void)viewDidLoad
这个方法有点类似于Activity的onCreate方法,我们如果想自己添加View的话,就是在这个方法中进行操作的。从上面的那个例子中我们可以看到在这个方法中我们定义了一个UILabel属性,而每个控制器又有一个非常重要的属性就是父View,我们自己需要添加的View都可以通过addSubView方法添加即可。

在iOS中添加View非常简单和方便,因为任何一个控件包括上面讲到的UIWindow都是继承UIView类,而这些控件可以随便添加其他控件,没有任何限制,比如你可以在一个按钮UIButton中添加一个标签UILabel完全可以的,但是你要是在Android中就不可以了,Android中如果一个控件要添加子View,他必须继承ViewGroup,比如我们常用的几种布局类,这个看来iOS真的比Android简单多了。

我们可以看到一个应用程序肯定会包含多个控制器的,因为一般应用都会包含多个页面,而且每个页面之间还可以跳转,在Android中Activity之间的跳转使用Intent来进行操作的,但是在iOS中没有这种机制,而是用特定的控制器管理类,一般是用到的导航控制器和选项卡控制器来做管理,具体知识到后面接受控制器在详细讲解。
4.总结四个对象关系
我们分析完了一个iOS程序中非常重要的四个对象:UIApplicationDelegate,UIWindow,UIViewController,UIView
这里写图片描述
从上图分析,一个应用程序包含了程序应用的代理对象UIAppDelegate类,应用窗口UIWindow类。然后窗口还有一个根控制器页面UIViewController类,每个控制器都有一个展示UI的父View,根控制器也不例外。最后是每个控制器都会关联一个父View用于展示每个页面的UI。到这里就完成整个应用了。

四、学习升级
1、下面就需要在应用的回调方法中设置窗口信息和根控制器信息
这里写图片描述
从这里就可以看到,一个应用其实最基本的元素有UIApplicationDelegate和UIWindow和根控制器就可以了,那么这个其实也是一个简单的应用了,但是在实际开发中肯定是包含多个控制器的,并且每个根控制器都对应一个View布局文件,所以下面就开始创建对应的View信息。当然这里可以在控制器的回调方法中手动的添加View,但是这里我们在介绍iOS中其实和Android一样,每个控制器都有对应的布局文件,这里叫做xib文件。
2、添加xib,新建一个xib
这里写图片描述
点击Next:
这里写图片描述
点击Create:
这里写图片描述
创建完成后,里边什么都没。我们接下来就需要创建了。

2、关联xib和控制器
然后我们把当前的xib的File’s Owner设置成我们的根控制器,其实也就是对应的类。这里必须得设置xib的File’ Owner,不然会报错的。
这里写图片描述

3.在xib中添加父View
设置好xib文件和控制器的关系,下面还得设置控制器的父View属性值,首先我们得给这个xib中添加一个View,如果不设置的话,运行程序会报错的,添加View很简单,我们在Xcode的最右下角有一个可以选择各种控件和对象的界面:
这里写图片描述
搜索View控件找到之后,直接拖到xib内容中就行。托成功之后,我们还需要把控制器的view属性关联到这个View控件中,不然也是会报错的。这里就很简单了,对于Xcode开发工具来说,只要一拖连接即可。如下图所示:
这里写图片描述

4.加载xib文件
到这里我们就新建好了一个根控制器以及对应的xib文件了,那么下面如果想让这个控制器展示这个xib内容,还需要做一些工作就是要手动的加载这个xib文件,上面那个连接操作只是简单的建立关系,加载还得自己写代码,就相当于Android中的setContentView方法效果一下,这里就需要改一下控制器的初始化方法了:
这里写图片描述
控制器提供了一个initWithNibName:bundle:方法,这个方法可以显示的加载一个xib文件,这里需要注意两点就是xib文件名不能携带后缀名,其次就是第二个参数表示xib文件的路径,传入nil表示从项目的根目录中查找。
设置了控制器加载xib代码之后,就可以运行程序了:
这里写图片描述
看到效果之后,我们不仅可以在控制器中手动编写代码添加View,也可以使用xib文件来进行页面布局。

综上所述,我们总结下:
1、UIAppDelegate类
这个类主要是用来管理应用的生命周期和一些事件的回调方法,每个应用都将有一个这个类。
2、UIWindow类
这个类主要是用来展示应用UI界面的窗口,他其实是一个特殊的UIView,可以像操作控件一样来操作它,而每个应用都有一个唯一的主窗口,也就是UIAppDelegate类中的window属性值。
3、UIViewController类
这个类相当于管理应用中每个页面的功能类,他和Android中的Activity非常类似,而一个应用一般都是会包含多个控制器的,但是一定有一个根控制器,这个控制器一般要设置到UIWindow的rootViewController属性值中。同时每个控制器如果要用代码布局,就在viewDidLoaded方法中进行添加,如果要用xib布局文件来操作,就需要手动的进行加载操作,使用控制器的initWithNibName:bundle:方法。
4、UIView类
其实这个类是iOS中每个控件的父类,但是每个控制器都有一个父View,这个就是UIView类,一般要设置到UIViewController的view属性值中的。

五、UIViewController生命周期方法的调用顺序
1.view初始化完毕后,就会调用控制器的viewDidLoad方法
2. view初始化完毕后,就会把这个根控制器的view添加到窗口中
3.当view即将被添加到窗口中时,就会调用控制器的viewWillAppear:方法
4.当view已经被添加到窗口中时,就会调用控制器的viewDidAppear:方法
5. 如果控制器的view即将从窗口中移除时,就会调用控制器的viewWillDisappear:方法
6.如果控制器的view已经从窗口中移除时,就会调用控制器的viewDidDisappear:方法
7.如果控制器接收到内存警告的时候,就会调用控制器的didReceiveMemoryWarning方法
didReceiveMemoryWarning方法的默认实现是:如果控制器的view没有显示在窗口中,也就是说controller.view.superview为nil时,系统就会销毁控制器的view.
8.销毁完毕后会调用控制器的viewDidUnload方法
9.如果控制器的view以前因为内存警告被销毁过,现在需要再次访问控制器的view时,会重复前面的步骤初始化view

页面跳转
如果使用导航
第一个按钮方法:
[self.navigationController pushViewController:secondVC animated:YES];
第二个按钮方法:
[self.navigationController popViewControllerAnimated:YES];

如果使用模态
第一个按钮方法:
[self presentViewController:secondVC animated:YES completion:nil];
第二个按钮方法:
[self dismissViewControllerAnimated:YES completion:nil];

六、总结
本文介绍的内容有点多,是我们开发iOS的入门,我们从这个简单的程序中可以了解到了一个程序涉及到的生命周期以及几个重要对象,他们之间的关联关系等。同时也了解了iOS中的界面布局功能和两种方法。

原创粉丝点击