在前面我们建立了一个简单的Hello World!程序。其实我们并不知道这个程序是怎么运行起来的,各组件是怎么工作的。事实在我们在iPad程序开发过程中,我们需要学习大量的知识。一穷 二白最艰难,但是也是最有效果和成就感的,当然也很枯燥。这节开始我们来一起了解创建iPad程序用户界面(UI)和怎样将我们的代码和图形工具进行链 接;

输出和事件响应

首先我们需要理解iPad程序的outlets(输出或者说引用)和Actions(事件响应或者动作),在这一点上,Objective其实和Java和C#很想像,概念是一样的就是实现的手法有所不同而已。好让我们用实例来讲解一下:

1.打开我们的Xcode,创建一个视图应用程序(View-based Application )取个名字叫OutletsAndActions

2.双击 OutletsAndActionsViewController.xib文件,打开Interface Builder。在View窗口中用Label,TextField,和Button插件分别创建一个标签、文字输入框和一个按钮。将标签名称改 为:Enter your Name,按钮名称弄成“OK”。如图:

3-1.jpg

3.在Xcode中,我们在OutletsAndActionsViewController.h文件添加代码:

#import <UIKit/UIKit.h>

@interface OutletsAndActionsViewController : UIViewController {

//---declaring the outlet---

IBOutlet UITextField *txtName; }

//---expose the outlet as a property---

@property (nonatomic, retain) UITextField *txtName;

//---declaring the action---

-(IBAction) btnClicked: (id) sender;

@end

#import <UIKit/UIKit.h>
@interface OutletsAndActionsViewController : UIViewController {
//---declaring the outlet---
IBOutlet UITextField *txtName;
}
Outlets and Actions ? 47
//---expose the outlet as a property---
@property (nonatomic, retain) UITextField *txtName;
//---declaring the action---
-(IBAction) btnClicked: (id) sender;
@end

4.在OutletsAndActionsViewController.m文件中添加下面代码:

#import “OutletsAndActionsViewController.h”

@implementation OutletsAndActionsViewController

//---synthesize the property---

@synthesize txtName;

//---displays an alert view when the button is clicked---

-(IBAction) btnClicked:(id) sender {

NSString *str = [[NSString alloc]initWithFormat:@“Hello, %@“, txtName.text];

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@“Hello!”

message:str delegate:self

  cancelButtonTitle:@“Done”

otherButtonTitles:nil];

  [alert show];

[str release];

[alert release];

}

找到dealloc段,添加:

- (void)dealloc {

//---release the outlet---

[txtName release];

[super dealloc];

}

5.剩下的操作很easy.按住Ctrl将File's Owner拖向文字输入窗口(TextField).在弹出的小窗口选

折txtName的输出.

3-2.jpg

6.按住Ctrl将Ok按钮拖动到File's Owner.选择btnClicked:的事件响应(action).

3-3.jpg

7.右键单机Ok按钮,我们可以看到事件列表

3-4.jpg

注意在这些事件中有一个事件-Touch Up Inside是被链接好了的,因为我们将按钮拖动到File's Owener

的时候系统会自动连接好.如果我们想对另外的事件做出响应,那么我们可以点击事件右边的圆圈,拖动它

到File's Owner中就可以了.

8.好了,C+S(Ctrl+S,^_^老九偷懒了),C+R.运行看看,在文字框中输入你的名字,然后按OK,

OH!Yeah!老九看到你叫什么名字了,呵呵

下面我们来讲解一下这个程序是怎么运行的:

在iPad中,我们用actions和outlets去链接我们可视化界面的各种代码.actions类似面对像语言中的

方法,outlets相当于对象的引用.当IBAction关键字被激活(被actions)的时候,outlets自动引用IBOutlet

关键字.

#import <UIKit/UIKit.h>

@interface OutletsAndActionsViewController :UIViewController {

//---declaring the outlet---

IBOutlet UITextField *txtName; }

//---expose the outlet as a property---

@property (nonatomic, retain) UITextView *txtName;

//---declaring the action---

-(IBAction) btnClicked: (id) sender;

@end

IBOutlet关键字:IBOutlet就是一个显式的引用访问标记,一般用于变量前面,以至于Interface Builder

能同步显示所引用的内容和与Xcode语言中的输出进行连接.@property是一个txtName的属性访问声明,扩号内支持以下几个属性:

1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。
默认的行为是原子性访问atomic.注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。(我在网上查的资料,我再问问正确的理解)

注意:IBOutlet标签经常被添加到@property标签中,这在水果公司的文档中比较常见,我们记住就ok了!

@property (nonatomic, retain) IBOutlet UITextField *txtName;

IBAction关键字:IBAction就是一个方法的显式引用标记,是被用于事件响应的方法的标记.比如当我们用鼠标点击按钮,这个action就是一个出发窗口事件发生的方法.另外一边,作为outlets所引用的内容也就跟随着你的代码所要实现的目的展现出来.

       额,在网上有人这样说:假设有两个黑盒子,盒子A里放着代码,盒子B里放着盒子A要用到的ui组件,要想让A里的代码访问到B里的组件,比如想要修改label的文字,那些就要从A处打个洞连到B处,这时就用IBOutlet,B中的组件如一个按钮被用户点击了,要给A发个通知,那么也要事先在A处安个接受装置,这时就用IBAcion.这个东西就只可意会了!

一旦你的actions和outlets被添加到了窗口控制的.h头文件中,我们这时就需要在Interface Builder中连接他们.

当我们按住Ctrl拉动File's Owner去链接TextField文字输入框并且选择txtName标签的时候,实际上我们就在我们用TextField文字输入框所创建的(txtName)上与outlet建立了一个连接.一把而言.连接到outlets我们所要引用的内容,就需要按住Ctrl将File's Owner拖动到视窗中所需要的窗口就可以了.

反过来:如果我们对Actions进行定义,我们就需要按住Ctrl拖动action的处罚点(如按钮)到File's Owner就可以了.

在.m执行文件中,@synthesize关键字是一段简化代码,表示系统自动生成getter和setter两个方法,不需要我们手动编写.(关于@property和@synthesize,这个文章写的很详细,建议新手们拜读,你会有更深入的认识http://www./bbs/read.php?tid-7322.html)

注意:忘记添加@synthesize关键字是初学iPad开发的开发者最容易犯的错误,记住这一点,不然你在运行程序的时候就会出现Runtime error了.空了查查Xcode帮助文档吧!

#import “OutletsAndActionsViewController.h”

@implementation OutletsAndActionsViewController

//---synthesize the property---

@synthesize txtName;

//---displays an alert view when the button is clicked---

-(IBAction) btnClicked:(id) sender {

NSString *str = [[NSString alloc]initWithFormat:@“Hello, %@“, txtName.text];

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@“Hello!”

message:str delegate:self

cancelButtonTitle:@“Done”

otherButtonTitles:nil];

[alert show];

[str release];

[alert release];

}

这段代码理解起来就容易了:一个包含用户名字消息的alert窗口,在btnClicked被action的时候显示出来.

注意这里的id表示任意类型的参数.sender将会允许程序自动寻找谁是这个action的调用者.这个在多个

窗口同时链接到一个action的时候十分有用.在很多例子中,我们经常需要知道哪一个窗口是这个方法的

调用者,sender的参数对应调用哪一个窗口.

慢慢理解,我也是看了n遍资料,查了n多例子程序才明白.今天到这里把,太晚了,明天,哦不,是今天早上我还

要出差呢.呵呵!