iPhone开发应用处理基本交互是本文要介绍的内容,MVC:(Model View controller 模型,视图,控制器)目标:实现三类尽可能截然不同的代码,编写的任何对象都应该很明显的划分为哪一类,并且其功能大部分不属于或者完全不属于另外两个类。
MVC可以帮助确保实现最大的可重用性。
模型:保存应用程序的数据的类。设计一些OBjective-C类来保存应用程序的数据。
视图:窗口、控件和其他用户可以看到并能与之交互的元素的组成部分。
控制器:将模型和视图绑定在一起,确定如何处理用户输入的应用程序逻辑。由开发人员创建的类和特定于应用程序的类组成。
Classes文件夹中的四个文件:(两对.m和.h文件)
IP_03buttonfunViewController将负责管理该视图。
- #import <UIKit/UIKit.h>
- @interface IP_03buttonfunViewController : UIViewController {
- }
- @end
这是UIViewController的子类。(UIViewController局势一个通用的控制器,他是UIKit的一部分)
IP_03buttonfunAppDelegate实现了应用程序委托。委托,负责为另外一个对象处理特定事情的类。通过应用程序委托,我们可以在预先定义的时间为UIApplication处理事情。
输出口(OutLet):
输出口Outlet,是一个特殊的实例变量,控制器类可以使用他来引用nib中的对象。可以把输出口看成是指向nib中的对象的指针。例如:假设在IB中创建一个文本标签,需要在代码中对该文本标签进行修改操作,这时就需要声明一个输入口,并将其指向该标签,这样就可以通过改输入口来修改该标签了。
输出口是使用关键字IBOutlet声明的实例变量。
IBOutlet关键字的定义如下:
- #ifndef IBOutlet
- #define IBoutlet
- #endif
对编译器而言,IBoutlet并未执行任何操作,他仅仅是告诉IB,此实例变量将被连接到nib中的对象。
操作(Action):
操作是控制器类中的方法,通过IBAction来声明。该关键字告诉IB,此方法是一个操作,并且可以被某个控件触发。
操作的声明如下:
- -(IBAction)doSomething:(id)sender;
没有任何返回值。操作方法接受一个参数,该参数为id类型。名称被制定为sender,触发操作的控件将使用sender参数引用其自身。
@property声明:
在以前的操作中遇到这个问题一直没有答案,今天在看这一章的时候,上面有详细的讲解,好好学学。
@property所声明的是一些属性。这也是Objective-C2.0的一个新特性。就想.NET中的set和get一样。在Objective-C中添加属性,通常会有设置属性和检索属性,这中方法被成为访问方法和修改方法。例如下面的形式:
- -(id)foo //访问方法
- {
- return foo;
- }
- -(id)setFoo:(id)aFoo
- {
- if(aFoo!=foo)
- {
- [aFoo retain];
- [foo release];
- foo = aFoo;
- }
- }
使用@property就告别了这种枯燥乏味的访问方法和修改方法。我们可以使用@property和@synthesize相结合,可以通知编译器在编译的时候创建获取方法和设置方法。一下面的例子为例:
- @property (retain,nonatomic) UILabel *statusText;
其中的参数retain,通知编译器向分配给此属性的对象发送一个保留信息,这样不会从内存中清楚。这是必不可少的。因为默认行为assign需要与垃圾收集一起使用。垃圾收集在IPhone当前尚未使用。
第二个可选属性nonatomic将更改访问方法和修改方法的生成方式。
Objective-C属性还具有另外一个特性,呢就是点表示法。
- myVar = [someObject foo];或者myVar = someObject.foo;都是可以的
- someObject.foo = myVar;等同于[someObject setFoo:myvar]
得到Button的Title:
- NSString *title = [sender titleForState:UIControlStateNormal];
在请求按钮的标题时我们要提供控件的状态,4种可能的状态为:
a:正常(normal)表示控件处于活动状态,但当前并未使用
b:突出显示(highlighted)表示控件正被按住或被使用
c:禁用(disabled)表示按钮未启用且无法使用
d:以选中(selected)仅特定控件具有该状态,表示控件当前已被选中
- NSString *newText = [NSString stringWithFormat:@"%@ button pressed.",title];
等同于
- NSString *newText = [[NSString allac] initWithFormat:@"%@ button pressed.", title];
实现的功能相同但是第一种方法不建议用。第一种方法被成为简便方法或工厂方法,它将返回自动释放的对象。在对象使用完成之后还会保留一段时间,浪费了内存,不建议使用。
[statusText release];既然我们没有实例化该对象,为什么还有release呢?
因为我们实现了各输出口的属性,并且为该属性指定了retain参数,因此我们必须要释放他。
创建例子:
打开Xcode。File->New Project->Iphone Application->View-Based Application->IP_03buttonfun
修改IP_03buttonfunViewController.h成:
- #import <UIKit/UIKit.h>
- @interface IP_03buttonfunViewController : UIViewController {
- IBOutlet UILabel *statusText;
- }
- @property (retain,nonatomic) UILabel *statusText;
- -(IBAction)buttonPressed:(id)sender;
- @end
修改IP_03buttonfunViewController.m成:
- #import "IP_03buttonfunViewController.h"
- @implementation IP_03buttonfunViewController
- @synthesize statusText;
- -(IBAction)buttonPressed:(id)sender
- {
- NSString *title=[sender titleForState:UIControlStateNormal];
- NSString *newText=[[NSString alloc]initWithFormat:@"%@ button pressed!",title];
- [statusText setText:newText];
- [newText release];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- }
- - (void)dealloc {
- [statusText release];
- [super dealloc];
- }
- @end
代码创建完毕,现在可以关联IB了。
拖两个Button一个Label到View中。修改Button为Lift和Right,修改Label为空并且调整适当的大小。
创建控件完毕。
选中Button Lift,然后Apple+2,看到Touch Up inside后面的一个小圈圈,用鼠拖到File's Ouner上面。同理Button Right一样的操作。
选中Label,Apple+2会看到statusText,和上面一样拖到File's Ouner上。
程序完成,Build and go运行结果如下。
小结:iPhone开发应用处理基本交互的内容介绍完了,希望本文对你有所帮助!