自打学iOS开发以来,也想找出适合自己的学习方法,因为埋头钻研语法的知识、开发的细节组成部分,实在是有些枯燥。这些东西本身是有用的,但是如果是初学者来自学的话,很容易陷入只见树木不见森林的困境,甚至因为没找到成就感和激励,过早地退出了自学的循环,扔下一句“我学不会”就离开了,也是挺可惜的(自己差点就这样:))。
自从碰到了Ray Wenderlich出的iOS Apprentice教程(一共4个App的教程),跟着做完了第一个BullsEye之后,觉得这种开始学习就能看见成果、由浅入深但不流于表面的学习方式,简直就是我期待已久的教程。做完了第一个教程的App,分享一下收获和体会。
学会程序员的思考方式
教程的开头,就是开始逐渐教你如何学会程序员的思考方式,比如作者给出了一个BullsEye的最终效果图,首先需要你去思考如何实现它。重点是这里并非是要你想到如何去用代码实现,因为你都还没开始学,而是要你用自然语言来描述一下需要做哪些步骤。知道要做什么之后,怎么做的问题基本就难不倒你了,这也是程序员的核心能力——分解任务和复杂的问题。
成为一个真正的程序开发者,还是成为一个代码工人,这也是你要去思考的,思考,正是区分二者的关键。
理解编程的基本概念
这也是这个教程的独特和难能可贵之处,因为作者并没有假设你会一些基本的概念,而把这些东西跳过去,相反,他把一些最最基础的概念讲解得非常形象化且易于理解:比如什么是变量?对象?发送消息?字符串?... ...等等这些编程的基本概念,在一般的书和教程中,要么是没有,或者就是非常枯燥、学术的解释。其实许许多多的想学编程人,往往会容易卡在这些问题上,而这些甚至被一般的写书的作者和大牛所忽视,因为太基础了。
成果激励——把知识点穿插于具体的App开发中
先学会C语言,再学Objective-C,再学iOS的Cocoa Touch框架,前面的都掌握之后,你就可以开始编写漂亮的App了。这个“理想”的路径看起来很美,但是在现实中,至少就我个人的经验来说,这基本不可行。
因为你想学iOS开发的初心或许是因为App Store中的那些美妙的应用、使用iPhone的优雅体验,总之都是一些很美好、有情感的东西打动了你,然后你想学iOS开发了,想开发出自己的App,抱着这个憧憬和目标,你打开了买来的书和教程,准备学C语言和Objective-C了。但是,当你硬着头皮往前学了一段时间,你还是不知道怎么开发一个App,甚至,教程上教你的仍然是命令行程序,连UI都没有,这时,你看了一下学习语言花去的时间,再估计一下自己开发出第一个App的时间,顿时觉得遥遥无期,这种挫折感足以令许多本来可以学会iOS开发的人望而却步。
那么,除了这条路径之外,还有没有别的更好的方法呢,这个教程就给出了一个很好的范例,你学到的知识是马上就可以应用到这个App的开发中的,而且关于这个知识点的记忆,是鲜活的,因为你清楚地知道它可以用来解决哪些问题,而不只是书本上的一个干巴巴的概念。
学习的过程和笔记
一、开发这个App的步骤分解
我写的步骤:
1.进入游戏之后,首先告诉用户需要干什么,怎么玩这个游戏,需要一个Label来告诉用户,比如“让滑动条接近20”;
2.目标数字怎么得来的呢?这需要在每回合随机生成一个1~100的随机数;
3.我需要有一个数值为1~100的滑动条,来让用户滑动;
4.用户在滑动条上拖动完成后,在滑动条下方提供一个按钮,用来核对游戏结果,并用一个alertView显示出来;
5.游戏结果怎么计算,其中的算法是:检查目标数字和用户拖动的数字之间的绝对值,用100分满分减去这个绝对值,得出0~100的得分;
6.有两个Label,分别用来显示累计得分和回合数;
7.提供一个重新再来的按钮,这样用户可以清空总得分和回合数,可以和别人一起比拼;
8.游戏要横屏操作;
9.游戏开始时,播放背景音乐,如果可以实现,最好在每次的得分宣布时,播放音效,比如“好棒啊,第一把就一击命中了~”;
10.有一个显示制作消息或帮助提示的按钮,点击会切换到另一个modal页面,里面显示textview或者一个webview,用来显示相关信息。
二、对象、消息和方法的概念
这三个对于iOS开发和面向对象编程,都是重要的概念。作者用一幅图,关于组织聚会、买冰淇淋是例子,形象地解释了这些概念。
三、变量的概念
形象地解释了变量的作用——存储某个数据,而且根据“形状”的不同,有五角星、有矩形,还告诉你声明的不同变量存储不同的数据类型。
四、算法
听到“算法”两个字,恐怕许多人会很头大,不过在BullsEye中,比较玩家的数值和目标数值的差距,来得出玩家的得分,作者用这个例子来引入算法的概念,帮大家祛魅、解除对算法的恐惧感。
五、代理的使用
这也是这个教程简洁但不简单的一个体现,很快就接触到iOS的一个核心的概念——代理,代理在iOS开发中应用广泛,这里用了一个例子:点击游戏的按钮、计算出得分之后,得分的显示框UIAlertView还在,游戏已经自动开始下一局了,这显然不是好的用户体验,所以借此引入了代理的概念。用户点击UIAlertView的Button时,发送消息给它的代理对象,让代理对象来实现代理方法,开始下一局。
六、美化界面
这样的用户交互界面,还称不上是一个真正的App,如果这样提交到App Store,毫无疑问会被拒的。所以,开始来美化这款App:
- 加载教程给出的图片资源文件,当然如果自己会PS的也可以自己画一些图标之类的;
- 美化按钮,给按钮加上背景图片;
- 美化滑动条,这个暂时苹果没有提供直接在storyboard上改,而是需要手写一段代码;
- 把游戏说明的textView改为webView,所以在这第一个教程我们就简单地接触到了加载网页,虽然是一个本地的HTML5页面;
七、适配多种屏幕
作为一款真正的App,显然不能只是在自己这款机型上用的,现在仍然可以运行iOS8的机型有:iPhone 4s、5、5c、5s、6、6 Plus,这就涵盖了3.5寸、4寸、4.7寸、5.5寸这几种屏幕尺寸,如果每个尺寸都要单独提供图片资源的话,相信开发者或者设计师会疯掉的。所以这时引入了自动布局(Auto Layout)技术,如果你是使用storyboard来设计UI界面的话,自动布局将更加便捷,可以直观地设置几个约束,你的App就可以跑在多个iPhone机型上了,还是挺酷的:)
八、真机调试运行
经过了一段学习的旅程,你完成了这个教程,这时,怎么能按捺住自己的冲动,而不把App装到自己iPhone上呢?在之前,这通常需要你有付费的开发者账号($99,或者¥688),但是随着Xcode7的即将发布,至少真机调试是不需要付费的(我没等Xcode7,已经在万能的淘宝解决了这个问题)
继续前进
做完了这个App,可谓麻雀虽小,五脏俱全,iOS开发的核心概念都有涉及,而且更重要的是,学习的过程就是做一个真实的App的过程,每一步都有进展、得到正向的激励反馈。已经迫不及待开始之后的几个教程了:)