上次初步接触了的Cocoa Touch应用,现在将要进行交互程序的设计。
这个应用非常简单,一个label标签会随着两个按钮的按下内容发生变化。
1.攻击按钮:Robert宰了一个僵尸;0
2.跳跃按钮:很遗憾Robert被绊了一下摔了个狗吃屎;(
1.基础概念MVC
也许你收看过《iOS5 斯坦福公开课》,但现在我还得啰嗦的讲一下MVC到底是什么东西,因为这非常重要!
MVC是将GUI应用程序逻辑分化的方法。
Model是用于存储程序数据的类。 可以用ObjectC或是CoreData构建模型。
View是视图程序,像上一节提到的label。
Controller是控制器,将模型和视图绑定在一起,如何相应和处理。 可以完全使用NSObject或是UIViewController。
这三者在设计的时候最好是协同工作,而不是有太多的耦合。
2.新建项目
新建一个项目命名为Play Button
公司名为Ubi
类前缀为BID
只勾选ARC
Bundle identifier: com.ubi.Play-Button
新建工程完毕。
3.文件构成和编写原理
上一章讲过有BIDAppDelegate.m和.h的文件,有BIDViewController.m和.h和.xib的文件。
.xib给人的感觉是interface builder的工作环境,那么肯定有一种交互可以反映这些UI元素。
给你讲一个故事:Issac和Rose是一对恋人,但是他们身处两个不同的太空舱。这时候他们之间的唯一交流方式是一种称为outlet的通信设备,Issac在自己的太空舱打开outlet,然后outlet指向Rose的太空舱,这时候两人就可以建立联系。在这里Issac是ViewController.m文件,Rose是.xib文件中的UI对象。而outlet被称为输出口。是指向xib文件UI对象的指针。
你在Interface Builder中创建一个对象,并且希望能在代码中改变该UI对象的内容。这时候你可以声明一个输出口将它与xib的对相关联起来。
任何事物都是相互的,只想让代码操作UI还不行。UI也想对代码的一些方法进行调用,这些方法称为action操作方法。例如命令interface builder在用户点击一个按钮的时候调用一个响应方法。
你所要见到的一些outlet和action:
outlet在BIDViewController.h文件中声明
@interface BIDViewController:UIViewController
{
UIButton *myButton;
}
@property (nonatomic,retain)UIButton *myButton;
@end
接下来是action
-(IBAction)doSomething:(id)Sender;
或者
-(IBAction)doSomething;
4.本项目的简述
这个项目上面都说过了,提供了两个按钮和一个文本。这两个按钮每一个都提供一个action,因为按钮要响应方法。参数sender用来指代每个按钮。
同时文本要提供一个outlet,因为要用程序使其产生内容变化。
5.详细的操作
毫无疑问,Cocoa Touch编程是一件非常有乐趣的事。我向你介绍:
在xib中找到button控件,然后拖曳到屏幕中央,双击该button然后输入为Fire,紧接着点击万能的辅助编辑器按钮,这时候BIDViewController.h窗口就自动弹出了。因为当前.xib文件的拥有对象是BIDViewController,所以其头文件就蹦跶出来了。你要为这个按钮在头文件中生成一个上边说的action。还记得上边说的,该按钮要调用方法,所以使用action。
1st.魅力编程就在这一步,按住control键然后拖曳Fire按钮到头文件的interface里面。蹦跶出一个窗口,修改为Action,名字为buttonPressed(是不是有点像在scaleform中编程?)类型为UIButton,后边就保持默认。
-(IBAction)buttonPressed:(UIButton*)Sender; //Sender标识Button
这时候如果打开BIDViewController.m文件还能发现:
-(IBAction)buttonPressed:(UIButton*)Sender
{
}
2nd.第二个按钮式Jump,和第一个按钮的创建一样,但在按住control拖曳的时候会有所不同,这时候将按钮拖到第一个按钮的上面,让两个按钮建立关联。放手之后发现会弹出“connect action”好了就这样完成了两个按钮的关联。
3rd.创建label,最简单的方法,但是在没有点击之前删除里面的标签字,同时使其居中显示。然后将其拖曳到头文件的interface中,弹出窗口选择outlet,名字为statusText,其他保持默认。在.m文件中生成了@synthesize statusText; //这时候代码中的变动将会反映到UI上。
不仅如此,.m文件中viewDidUnload方法还会出现一个卸载语句 [selfsetStatusText:nil]; //也就是说当视图被卸载时必须释放所有的outlet,否则就无法释放他们的内存。
在学习ObjectC的时候谈到内存管理非常重要和麻烦,但在iOS5中对勾勾选的ARC(引用计数器)一项搭载苹果的新LLVM编译器据说可以像JAVA那样进行垃圾回收,所以内存管理我暂时不去管,也许会出很多问题,但是我太懒又不负责任;D
6.功能代码实现
在BIDViewControlller.m文件中给按钮添加功能实现
-(IBAction)buttonPressed:(UIButton*)sender
{
NSString* title=[sender titleForState:UIControlStateNormal]; //sender参数确定按钮,titleForState是按钮的状态,返回类型为NSString,UIControlStateNormal正常状态下(未被按下的)记着我们之前双击按钮给其命名为Fire
statusText.text=[NSString stringWithFormat:@"%@ button Pressed.",title]; //这里为statusText赋值为title,title上边赋值为Fire
}
运行一下,我这边的代码没有问题; )
7.应用程序委托
简单的说,输出这些程序还有很多窗口初始化的工作,你发现自己根本没有写代码。这些就是应用程序委托做的工作。
每一个Cocoa Touch应用都有个UIApplication实例,在学习ObjectC的时候有这么一种方式:
@interface BIDAppDelegate: UIResponder <UIApplicationDelegate>
@end
尖括号内的就是委托,他是应用遵循的一种协议。
8.总之
你可以暂时不对委托有深入的了解,他就是帮你解决省去麻烦的问题。但最好清楚他是干什么的。
这一章学了基础的交互,这些原理方法非常重要。下一章将会是引入更大量的控件,这样应该很有趣。
我们在学习这个系列后起码应该掌握的技能是做一个自己能牵连的网站,这里我牵连自己的blog;)