iPhone应用程序 Say Hello实例操作 (下篇)是本节介绍的内容,继续 iPhone应用程序 Say Hello实例操作 (中篇)的内容开始介绍,先来看本节介绍。
实现视图控制器
实现视图控制器需要完成以下几件事:
定义插座变量和动作方法,和Nib文件的视图中的界面元素进行关联
实现点击按钮后的相关逻辑——根据输入的名字显示相应的招呼语,判断输入的名字是不是为空是不是超长
用户点击键盘上的完成(Done)按键后,键盘会消失
建立连接
从业务角度来看,我们需要和界面的几个元素建立关联:
文本输入框,获取它的输入文字
文本标签,让它显示特定文字
按钮,响应它的点击事件
在Xcode4之前,Interface Builder和Xcode是分开的,一般是先在Xcode中定义好插座变量和动作方法,然后再在InterfaceBuilder中去建立界面元素和视图控制器之间的连接,到Xcode4之后,Interface Builder和Xcode已经统一合并在了一起,所以这部分也有一些变化,Xcode4让这部分工作变的更加容易一些,可以直接从视图编辑界面拖动连接到代码文件。
在我们正在开发的SayHello项目中,现在我们需要添加一个动作方法到视图控制器,当界面上的按钮被点击时,它会发送一个sayHello:消息到视图控制器,所以接下来要为按钮创建一个sayHello:动作方法:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
让Assistant显示视图控制器的头文件(RootViewController.h)
按住Control键,从Nib文件中的按钮拖动到头文件的方法声明代码区域
在弹出的面板中,将按钮和视图控制器之间的连接设置为动作(Action)
设置 Connection 为 Action
设置 Name 为 sayHello:
设置 Type 为 id
设置 Event 为 Touch Up Inside,也就是用户在点击按钮,然后释放后触发
设置 Arguments 为 Sender
点击Connect建立连接
通过上面的为按钮添加动作的操作,完成了两件事
添加了相应的代码到视图控制器的类中
头文件中增加了如下代码:
- - (IBAction)sayHello:(id)sender;
并且实现文件中增加了相应的实现方法:
- - (IBAction)sayHello:(id)sender {
- }
IBAction 是一个特殊的关键字,它唯一的作用是告诉Interface Builder将某个方法当成目标/动作关联中的动作。它被定义为void。
建立了按钮到视图控制器之间的连接。建立连接的意义,等同于在按钮上调用 addTarget:action:forControlEvents: ,并且 target 是文件拥有者(File's Owner)也就是视图控制器,action 是 sayHello: 方法,对应的事件是 UIControlEventTouchUpInside。
接下来要建立文本输入框和文本标签之间的连接:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
让Assistant显示视图控制器的头文件(RootViewController.h)
按住Control键,从Nib文件中的文本输入框拖动到头文件的方法声明代码区域
在弹出的面板中,将文本输入框和视图控制器之间的连接设置为插座(Outlet)
设置 Connection 为 Outlet
设置 Name 为 nameTextField
设置 Type 为 UITextField
点击Connect建立连接
通过上面的为文本输入框添加插座变量的操作,完成了两件事
添加了相应的代码到视图控制器的类中
头文件中增加了如下代码:
- @property (nonatomic, retain) IBOutlet UITextField *nameTextField;
并且实现文件中增加了相应的实现方法:
在顶部增加了:
- @synthesize nameTextField;
在 dealloc 方法中添加了
- [nameTextField release];
在 viewDidUnload 方法中添加了:
- [self setNameTextField:nil];
IBOutlet是一个特殊的关键字,它唯一的作用是通知Interface Builder将某个实例变量或者属性当成插座变量。实际上,这个关键字被定义为空白,因此在编译的时候它没有任何作用。
建立了文本输入框到视图控制器之间的连接。建立连接的意义,等同于在视图控制器上调用 setNameTextFiled: 方法,将文本输入框作为参数传入。
按照上面创建文本输入框插座变量相同的方法,再建立用来显示问候语的文本标签的插座变量,并且将插座变量命名为 greetingLabel,类型为 UILabel。
实现逻辑代码点击视图中的按钮,它会向视图控制器发送 sayHello: 消息,之后,视图控制器会取得文本输入框文字内容,根据内容来更新用来显示问候语的文本标签的内容。以下是RootViewController.m文件中 sayHello: 方法代码的实现:
- - (IBAction)sayHello:(id)sender {
- // 获取文本输入框内容,并存储到变量中
- NSString *nameString = nameTextField.text;
- // 检查输入的名字是否为空,如果为空,弹出提示信息
- if (nameString.length == 0) {
- UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"名字不能为空" message:@"请输入名字后,重新点击按钮。
- " delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
- [alertView show];
- [alertView release];
- greetingLabel.text = @"";
- return;
- }
- // 检查名字是不是超过16个字符,超过16个字符自动截断
- if (nameString.length > 16) {
- nameString = [nameString substringToIndex:16];
- }
- // 根据输入的名字,生成问候语
- NSString *greeting = [NSString stringWithFormat:@"你好,%@!", nameString];
- // 显示问候语
- greetinggreetingLabel.text = greeting;
- }
对于这个方法有几点补充说明:
UIAlertView是专门用来显示消息提示对话框
stringWithFormat:方法符串按照格式化字符串所指定的格式创建一个新字符串。%@表明此处应该使用一个字符串对象来代替。
隐藏键盘编译并运行应用程序。在文本框中输入“Jim”,点击按键后,标签显示“你好, Jim!” 。但是选择文本字段进行输入,您会发现您没有办法表示已完成输入,也没有办法消除键盘。在iPhone应用程序中,当一个允许文本输入的元素变成第一响应者时,键盘就会自动显示出来,而当该元素不再处于第一响应者状态,键盘就会消失。我们不能直接向键盘发送消息,但是可以切换文本输入元素的第一响应者状态,利用该操作的附加效果来显示或消除键盘。在应用程序中,当用户点击文本字段时,该控件就会变成第一响应者,因此键盘就会显示出来。而当用户点击键盘中的Done按键时,希望键盘消失。
UITextFieldDelegate协议包含一个textFieldShouldReturn:方法,一旦用户点击Return按键,文本字段就会调用该方法(和按键的标题无关)。但将视图控制器设置成文本输入框(UITextField)的委托(Delegate),才可以实现该方法,在方法中向文本字段发送resignFirstResponder消息,这个消息的附加效果会让键盘消失。
通过以下步骤设置文本输入框的委托(delegate)连接:
在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)
按住Control键,点击文本输入框
在弹出的半透明面板中,选中 delegate 后面的圆点,并拖动到 File's Owner
接下来,来实现将RootViewController作为文本输入框nameTextField的委托(delegate)
在视图控制器的头文件(RootViewController.h)中,在UIViewController后面添加<UITextFieldDelegate>:
@interface RootViewController : UIViewController<UITextFieldDelegate> {
这个申明表示视图控制器RootViewController将支持UITextFieldDelegate协议
在视图控制器的实现文件(RootViewController.m),实现 textFieldShouldReturn: 方法:
- - (BOOL)textFieldShouldReturn:(UITextField *)textField {
- if (nameTextField == textField) {
- [nameTextField resignFirstResponder];
- }
- return YES;
- }
因为这个应用程序只有一个文本输入框,所以其实不需要包含nameTextField == textField检查。不过有些时候,对象可能会被设置成多个相同类型的对象的委托,这时候就需要来区分这些对象。
至此我们已经开发完成了整个应用程序。接下来将对它进行测试。
测试
这个应用程序相对简单,我们设计几个测试场景:
输入正常的名字,例如“宝玉”,然后点击按钮,看看是不是会显示“你好,宝玉!”
不输入任何名字,点击按钮,看看是不是会有提示信息,要求输入名字。
分别输入16个、17个、20个字符的名字,看看名字是不是最多只能显示前16个字符
点击文本输入框,显示键盘,点击键盘上的Done按钮,看键盘是不是会隐藏
针对这个测试场景,逐一做一下功能的测试,看起来结果和我们预期的完全一样。
小结:关于iPhone应用程序 Say Hello实例操作 (下篇)的内容介绍完了,希望本实例对你有所帮助。通过这样一个简单的项目,了解以下知识点: iOS开发常用的一些设计模式;iPhone程序的启动过程;视图控制器和Nib文件如何建立连接,这些知识对于iPhone开发和iOS开发来说,都是会经常用到的知识。
本文来自:http://www.cnblogs.com/dotey/archive/2011/06/09/2075954.html