前一阵子学习了iOS开发的一些知识,无论是《Start Developing iOS Apps Today》还是《Programming with Objective-C》都是偏重理论,这里自己做了一个简单的toy app - HelloBrowser来对之前学的各种基础知识(确实都是基础的东西)进行综合应用。
功能
app的UI很简单,如下图所示
这是一个单页面应用,页面上一共有3个Controls:
- 地址栏 - UITextField
- 按钮GO - UIButton
- 浏览器 - UIWebView
它有以下功能:
- 首次启动,浏览器自动载入默认地址
- Universal app,适配iPhone/iPad,最低要求iOS7.0
- 浏览器加载地址栏里边的地址(简单起见,对地址栏里的网址只做了非空检测)
- 点击按钮GO之后会触发
- 在键盘里点击”GO”后会触发并自动隐藏键盘
使用到的知识点
- 开发一个iOS app的整个流程,从创建到最后真机/模拟器调试(这个例子是个单页面应用)
- 使用真机调试可以参考之前的一片文章 - 使用Apple ID免费真机调试
- 使用Interface Builder进行布局设计,应用AutoLayout解决适配问题
- 总体感觉,iOS的View+AutoLayout非常类似于Android中的LinearLayout
- 创建Outlets与Referencing Outlets的delegate
- Outlets属于交互的范畴,它可以自动地将Storyboard文件中的对象(一般是Control)与源文件中的对象(一般是property,其赋值由系统自动完成)建立联系
- Referencing Outlets的delegate就是《Start Developing iOS Apps Today》中讲的设计模式中的Delegation。即一个对象代表或与另一个对象协作配合。这个一般和Protocol结合起来用于实现某些”回调”。
- 使用Protocol机制实现回调方法
- Objective-C的Protocol非常像Java中的接口
- Protocol一般用于监听指定的事件,类似于Android中的setOnClickListener(XX接口)之类的方法做的事情
- 使用Class Extensions机制定义私有变量
- 这个在《Programming with Objective-C》的”Customizing Existing Classes”章节中有介绍,它的语法很像匿名的Categories(P.S. Categories机制是不通过继承而对现有的类进行扩展的方法)
- 理解几个关键字/修饰符:weak, strong, atomatic, nonatomatic, IBOutlet, IBAction
- weak与strong整好是相对的,都涉及到内存管理
- weak修饰后的property与变量对所持有的原始的对象的生命周期不造成影响
- 而strong修饰后,会使得其所引用的对象的存活时间至少与持有它的对象的时间一样长(在《Programming with Objective-C》中的”Encapsulating Data”章节的”Avoid Strong Reference Cycles”中有说明)
- 在Objective-C中,strong是默认的
- atomic与nonatomic也是相对的,它们会影响合成的accessors方法
- atomic会确保所合成的accessors方法总是会返回完整的值或者设置完整的值,即使实在多线程的环境下
- nonatomic则指定所合成的accessors方法直接的设置或返回一个值,并不会确保在多线程环境下返回完整的值或者设置完整的值
- 综上,访问nonatomic的property要比atomic的property速度快
- 注意:property的atomic与线程安全是两回事。使用atomic只能保证在多线程环境下返回的是完整地值,但是并不负责线程同步。有关线程同步,可以参考《Concurrency Progromming Guide》 (我也还没有学习呢)。
- 在Objective-C中,atomic是默认的
- IBOutlet关键字则告诉Xcode你把其所修饰的property连接到了Interface Builder,之中IB指的就是Interface Builder,Outlet见上面的解释
- IBAction是方法的返回类型,它说明该方法是一个action,并且已经连接到了Interface Builder里的storyboard中
- weak与strong整好是相对的,都涉及到内存管理
- 键盘的相关操作
- 隐藏键盘
- apple的官方文档中有说明,见Dismissing the Keyboard,只需要执行
[myTextField resignFirstResponder];
- 这个问题涉及到Responders的知识,具体可以参考《Event Handling Guide for iOS》里的”Event Delivery: The Responder Chain”章节(我喜欢在官方文档里边找依据,而不是baidu)
- apple的官方文档中有说明,见Dismissing the Keyboard,只需要执行
- 修改return key的显示文字
- 在启用键盘的UITextField对象上发送
setReturnKeyType:UIReturnKeyGo
消息即可,我这里用的是参数UIReturnKeyGo
- 在启用键盘的UITextField对象上发送
- 监听return事件并进行处理
- 将ViewController设置为UITextField对象的delegate,然后声明UITextFieldDelegate protocol,实现
- (BOOL)textFieldShouldReturn:(UITextField *)textField
方法,在该方法里进行处理
- 将ViewController设置为UITextField对象的delegate,然后声明UITextFieldDelegate protocol,实现
- 隐藏键盘
- 使用”#pragma mark”为方法分组
- 用它来进行方法分组,在Outline里看起来条理比较清楚
- 在iOS9中开启http协议的支持
- iOS9引入了新特性App Transport Security (ATS),要求App的网络访问必须使用https协议,看考这篇文章来解决 - iOS9 HTTP 不能正常使用的解决办法
- 将xcode project同步到github上
- xcode创建项目的时候会自动使用git来进行代码管理,现在有了Github桌面客户端,可以非常方便地将本地git repo上传到github上 - 打开Github桌面客户端,add本地的git repo,然后publish就可以了
总结
在实际做一些东西之后,对期间使用的各种知识点会有更深一步的理解,而不仅仅是看过理论之后的知道。
这个toy app虽然简单,熟练的话,可能几分钟就能做完。但是麻雀虽小,五脏俱全,开发iOS app所用到的大部分的基础知识点都有涉及。
代码我上传到了github上了:https://github.com/fimh/iOS-HelloBrowser.git