21.2.2 输入代码
现在,我们可以修改一些项目文件。注意,已经创建了名为[项目名称]AppDelegate.h和[项目名称]AppDelegate.m的类,在这个例子中[项目名称]就是iPhone_1。在要创建的基于窗口的应用程序中,处理各种按钮和标签的工作委托给了一个名为[项目名称]AppDelegate的类,在这个例子中,这个类叫做iPhone_1AppDelegate。在这个类中,我们定义方法来响应iPhone窗口中出现的操作,比如按下按钮或者移动滑块。你可以看到,实际连接这些控件和响应方法是在Interface Builder中完成的。
该类还有一些实例变量,它们的值对应于iPhone窗口中的一些控件,比如标签名称或可编辑文本框内显示的文本。这些变量称为出口,而且与操作例程一样,实例变量与iPhone窗口中实际控件的连接是在Interface Builder中完成的。
对于第一个应用程序,我们需要一个方法来响应按下标示为1的按钮的操作。我们还需要一个出口变量,用于包含我们在iPhone窗口顶部创建的标签中显示的文本和其他信息。
编辑文件iPhone_1AppDelegate.h,添加一个名为display的新UILabel变量,并声明一个名为click1:的操作方法,以便响应按下按钮的操作。接口文件的内容应该如代码清单21-1所示(在文件头部自动插入的注释行在此不显示。)
代码清单21-1 iPhone_1AppDelegate.h
import<UIKit/UIKit.h>
@interface iPhone_1AppDelegate:NSObject<UIApplicationDelegate>{
UIWindow*window;
UILabel*display;
}
@property(nonatomic, retain)IBOutlet UIWindow*window;
@property(nonatomic, retain)IBOutlet UILabel*display;
-(IBAction)click1:(id)sender;
@end
注意,iPhone应用程序导入了头文件<UIKit/UIKit.h>。这个头文件又导入了其他UIKit头文件,导入方式与Foundation.h头文件导入其他所需头文件(如NSString.h和NSObject.h)时类似。如果想要查看这个文件的内容,必须费一番功夫。下面是撰写本书时,它在我的系统上的安装位置:
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulat
or2.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h
iPhone_1AppDelegate类现在有两个实例变量。第一个变量是一个名为window的UIWindow对象。该实例变量是在创建项目时自动创建的,它引用的是iPhone的主窗口。你添加的另一个名为display的实例变量属于UILabel类。这是一个出口变量,将连接到一个标签。设置这个变量的文本字段时,它会更新窗口中标签的对应文本。为UILabel类定义的其他方法允许设置和获取标签的其他属性,比如它的颜色、行数和字体大小。
当你学习了我们在此没有介绍的其他iPhone编程内容时,可能会在界面中使用其他的类。这些类中有一些的名称就表明了它的用途,比如UITextField、UIFont、UIView、UITableView、UIImageView、UIImage和UIButton。
window和display实例变量都是出口,而且在这两个变量的属性声明中,要注意IBOutlet标识符的使用。实际上在UIKit头文件UINibDeclarations.h中,IBOutlet的定义没有任何意义(也就是说从字面上,预处理器可以在源文件中将它替换成空白。)然而,Interface Builder在读取头文件时,只有定义为IBOutlet的变量才可以用作出口。
在接口文件中,注意我们声明了一个名为click1:的方法,它带有一个参数sender。调用click1:方法时,与事件相关的信息就是通过这个参数传递给该方法的。例如,对于用于响应按下不同按钮操作的例程,可以查询此参数来确定按下的是哪个按钮。
click1:方法的返回值类型定义为IBAction。(UINibDeclarations.h头文件中定义为void。)和IBOutlet一样,读取头文件时,Interface Builder使用这个标识符来确定可以用作操作的方法。
现在,是时候为你的类修改相应的iPhone_1AppDelegate.m实现了。在这里,你可以为display变量编写存取器方法(window访问方法已经合成了),并添加click1:方法的定义。
按照代码清单21-1中的内容编辑你的实现文件。
代码清单21-1 iPhone_1AppDelegate.m
import“iPhone_1AppDelegate.h“
@implementation iPhone_1AppDelegate
@synthesize window, display;
-(void)applicationDidFinishLaunching:(UIApplication*)application{
//Override point for customization after application launch
[window makeKeyAndVisible];
}
-(IBAction)click1:(id)sender
{
[display setText:@“1”];
}
-(void)dealloc{
[window release];
[super dealloc];
}
@end
iPhone运行时,系统将自动调用一次applicationDidFinishLaunching:方法。正如其名所示,应用程序已经结束了启动。在这里,你可以初始化实例变量,在屏幕上绘制内容,并让窗口可见以显示其内容。最后一个操作是通过在方法结尾把makeKeyAndVisible消息发送给窗口来完成的。
click1:方法使用UILabel的setText:方法将出口变量display设为字符串1。在将按钮的按下动作连接到这个方法的调用上后,它能够执行预定的操作,将一个1放入iPhone窗口的显示中。为了进行连接,你现在必须学习如何使用Interface Builder。在这样做之前,编译程序,以便排除所有的编译器警告或出错消息。