《疯狂iOS讲义(上)》第九章学习心得

从四天前我正式进入iOS的SDK编程开发学习,可以说刚上来就被各种各样的困难给狠狠地打击了一下。

首先,说一下我从书中学到的知识吧。
iOS开发所用的编译环境是Xcode6,新建了一个test项目。
Xcode6和之前Xcode版本的项目文件分类略有不同,取消了Frameworks文件夹。之前版本的Frameworks文件夹中包含有四个框架,分别是:UIKit.framework、Foundation.framework、CoreGraphic.framework和XCTest.framework。
iOS开发一个显著的特点就是将界面设计的工作放在了Main.storyboard中。
左侧的列表叫做dock区,里面的根目录是一个Scene,里面包含所有的viewcontroller,而右侧则是controller所操控的界面。
当前的这个界面中含有两个UIView控件,分别是Label和Button。当你点选其中任何一个控件时,再点击右上角的属性检查器面板,可以在里面对控件的各种属性进行修改编辑。 
Xcode在属性面板检查器中各种属性的布局是分模块的,分模块的依据就是这个控件类的继承树,子类的属性在上面,父类的属性靠下,就比如这个Label控件,它继承自View根控件,因此Label在上面,而View在下面。如果点击Button按钮,由于它继承自Control根控件,因此排列也是自上而下的由子类到父类的顺序。
控件的各种属性需要程序员自己长期的实践来熟悉它们,文中不再赘述。
大体浏览完Xcode6的整体界面后,我们来说说iOS开发所严格遵守的MVC设计模式。
开始前,我们先了解一下iOS程序的运行机制。
iOS也是从main函数开始执行的,只不过main函数当中只有一句最重要的代码:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

UIApplicationMain函数首先要创建一个UIApplication的实例,而且是单例模式创建的,因为这个对象就代表着整个iOS程序本身。第三个参数为nil,则代表着这个实例的名称为UIApplication,不然的话则要自己定义实例的名称,一般也不推荐。第四个参数则是创建应用程序的委托代理。这个函数是一个“死循环”,应用程序的各种生命周期事件会循环往复的在执行,直到程序被终止,这个函数才会退出。
注:UIApplicationMain函数还会做一件事,那就是加载主界面设计文件,并且把对应的用户界面显示在窗口中。
而委托类则是处理生命周期事件的主要负责类,应用程序委托对象是整个iOS应用第一个被加载、执行的对象,它满足两个规则:继承自UIResponder基类和实现UIApplicationDelegate协议。
注:UIResponder是iOS应用提供的一个基类,所有需要向用户提供响应的对象都需要继承UIResponder基类。
这个UIApplicationDelegate协议中提供了许多重要的成员方法。这些方法负责处理iOS应用的各种生命周期事件。程序会默认的在.m文件中提供默认的一些方法,它们分别是:
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
-(void)applicationWillResignActive:(UIApplication *)application
-(void)applicationDidEnterBackground:(UIApplication *)application
-(void)applicationWillEnterForeground:(UIApplication *)application
-(void)applicationDidBecomeActive:(UIApplication *)application
-(void)applicationWillTerminate:(UIApplication *)application
它们的执行顺序一般是按照:如果是进入后台则先失去焦点,如果要进入前台则先进入前台再得到焦点。
以上就是iOS应用程序的运行机制。
接下来我们就说一下MVC。
iOS的Model一般是由一些普通的OC类来充当的,这些类可用于保存少量的应用程序状态。如果状态数据较多,则可以考虑使用Core Data来构建数据模型。
iOS的View主要使用Interface Builder或storyboard来创建,有时也会在代码中进行创建、修改甚至扩展已有的组件。
而iOS的controller则是由开发者开发的OC类来充当,大部分的controller会继承UIKit框架中的UIViewController基类来获得大量的功能。通过这些功能,controller就可以控制和它们相关联的视图组件。这些功能方法有:
viewDidLoad
didReceiveMemoryWarning
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewWillLayoutSubview
viewDidLayoutSubview
iOS的MVC大体上就是这样的了。
如果想让view中的控件能够响应用户的操作,那么首先就要让程序去获取这些控件,iOS提供了两种方式去获取控件:
1. 通过IBOutlet来获取控件
2. 通过为控件指定Tag属性来获取控件
具体的操作很简单,就不赘述了。
获取完控件之后,还要设置事件的处理机制,意思就是说你获取了控件之后,针对它发生的一些事件需要程序员去编写响应函数。事件一般是枚举值,因为控件总共也就那么一些可能的事件发生,例如点击、多点触控、滑动等等。但响应函数需要程序员去编写。iOS常见的事件处理机制有三种方式:
1. 通过IBAction绑定控件的特定事件到控制器的指定方法上
2. 在程序中为UI控件的特定事件绑定事件监听器
3. 对于UI控件的某些生命周期事件直接委托给对应的委托对象去处理
上述三种方法的操作也不再赘述。不过对于第二个方法,要记住一个事件绑定方法:-(void)addTarget:(id) action:(SEL) forControlEvents:(UIControlEvents)。
至此,基本的iOS程序开发流程有了一个大致的了解,可当我编写完代码,准备运行的时候,大麻烦就来了。
首先,点击运行的时候,出现下面的错误:

"Xcode cannot run using the selected device."
我一看,原来我选择的真机测试模式,我点击 iOS Device后,弹出一个菜单,可里面只有这一个选项!我的模拟器都不见了!
于是我去网上寻找各种答案,第一天得到的答案是要调整项目的Deployment Target参数。我将其修改成iOS7.1、7.0、6.1、6.0甚至到4.3,发现还是没有模拟器,原因不在这里。
第二天我从网上得到的答案是在preference的download标签下去下载模拟器,我突然意识到,我更新了Xcode6之后确实没有下载模拟器,于是我觉得我终于找到了答案,兴冲冲的去下载了。
下载Components完成之后,我沮丧地发现还是没有模拟器,这个时候我真的感觉好无力啊……
第三天我去网上找,各种相同的答案,各种同病相怜的同胞,有的说卸载Xcode重装,我觉得值得一试,于是我就真的把Xcode卸载了,卸载它需要用到终端,还要把它的残留都得清理干净,对于我这种刚刚接触Mac OS X刚有一个月的人来说,这种东西真的有点超出我个人的能力范围。不过,我还是把它卸载了,最后又在Apple Store中安装上了Xcode6。然后又下载完模拟器之后,发现——还是不行……
第四天偶然发现有人说去Xcode的windows里面去添加模拟器,我用快捷键command+shift+2打开了界面。
在左下方有一个“+”,点击它。出现一个对话框,在这里可以添加模拟器。
看到这一幕,我真的想哭了,终于让我找到你了,终于知道怎么创建模拟器了,哎,操蛋的人生终于迎来春天了……可是,当我选择完毕,点击Create之后,噩耗再次袭来!
提示我说:“unable to determine simdevicesetsetpath=…...”等号之后的省略号是一段路径,每个人的电脑不同,路径也不相同。我一个Mac小白,看到这真跪了。心想这台破Mac是罢工的节奏啊!还能不能愉快地编码了?
过了很久,我终于想出了一个办法,要不就找到这个路径看看吧,按照提示的路径我一级一级地往下找,发现路径不存在,我在想,是不是Xcode6需要在这个路径下去创建模拟器,而当它想创建文件夹的时候,系统的安全设置又阻止了它这么做呢?我抱着这个想法去按照它提示的路径一级级地创建了出来,第一次创建的时候还提示输入管理员密码。我有种预感,这一定就是症结所在了!
创建完路径之后,我再次cmd+shift+2去创建simulator——终于,成功了。

如果有什么疑问请加Q:1223536070。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章