iPhone应用程序 Say Hello实例操作 (下篇)

移动开发 iOS
本文介绍的是iPhone应用程序 Say Hello实例操作,以图文的形式为友们介绍,刚方便与操作学习,我们先来看内容。

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 editoriPhone应用程序 Say Hello实例操作

让Assistant显示视图控制器的头文件(RootViewController.h)

iPhone应用程序 Say Hello实例操作

按住Control键,从Nib文件中的按钮拖动到头文件的方法声明代码区域

在弹出的面板中,将按钮和视图控制器之间的连接设置为动作(Action)

设置 Connection 为 Action

设置 Name 为 sayHello:

设置 Type 为 id

设置 Event 为 Touch Up Inside,也就是用户在点击按钮,然后释放后触发

设置 Arguments 为 Sender 

iPhone应用程序 Say Hello实例操作

点击Connect建立连接

通过上面的为按钮添加动作的操作,完成了两件事

添加了相应的代码到视图控制器的类中

头文件中增加了如下代码:

  1. - (IBAction)sayHello:(id)sender; 

并且实现文件中增加了相应的实现方法:

  1. - (IBAction)sayHello:(id)sender {  

IBAction 是一个特殊的关键字,它唯一的作用是告诉Interface Builder将某个方法当成目标/动作关联中的动作。它被定义为void。

建立了按钮到视图控制器之间的连接。建立连接的意义,等同于在按钮上调用 addTarget:action:forControlEvents: ,并且 target 是文件拥有者(File's Owner)也就是视图控制器,action 是 sayHello: 方法,对应的事件是 UIControlEventTouchUpInside。

接下来要建立文本输入框和文本标签之间的连接:

在Xcode中,选择视图控制器对应的Nib文件(RootViewController.xib)

显示Assistant editoriPhone应用程序 Say Hello实例操作

让Assistant显示视图控制器的头文件(RootViewController.h)

按住Control键,从Nib文件中的文本输入框拖动到头文件的方法声明代码区域

iPhone应用程序 Say Hello实例操作

在弹出的面板中,将文本输入框和视图控制器之间的连接设置为插座(Outlet)

设置 Connection 为 Outlet

设置 Name 为 nameTextField

设置 Type 为 UITextField 

iPhone应用程序 Say Hello实例操作

点击Connect建立连接

通过上面的为文本输入框添加插座变量的操作,完成了两件事

添加了相应的代码到视图控制器的类中

头文件中增加了如下代码:

  1. @property (nonatomic, retain) IBOutlet UITextField *nameTextField; 

并且实现文件中增加了相应的实现方法:

在顶部增加了:

  1. @synthesize nameTextField; 

在 dealloc 方法中添加了

  1. [nameTextField release]; 

在 viewDidUnload 方法中添加了:

  1. [self setNameTextField:nil]; 

IBOutlet是一个特殊的关键字,它唯一的作用是通知Interface Builder将某个实例变量或者属性当成插座变量。实际上,这个关键字被定义为空白,因此在编译的时候它没有任何作用。

建立了文本输入框到视图控制器之间的连接。建立连接的意义,等同于在视图控制器上调用 setNameTextFiled: 方法,将文本输入框作为参数传入。

按照上面创建文本输入框插座变量相同的方法,再建立用来显示问候语的文本标签的插座变量,并且将插座变量命名为 greetingLabel,类型为 UILabel。

实现逻辑代码点击视图中的按钮,它会向视图控制器发送 sayHello: 消息,之后,视图控制器会取得文本输入框文字内容,根据内容来更新用来显示问候语的文本标签的内容。以下是RootViewController.m文件中 sayHello: 方法代码的实现:

  1. - (IBAction)sayHello:(id)sender {  
  2. // 获取文本输入框内容,并存储到变量中  
  3. NSString *nameString = nameTextField.text;  
  4. // 检查输入的名字是否为空,如果为空,弹出提示信息  
  5. if (nameString.length == 0) {  
  6. UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"名字不能为空" message:@"请输入名字后,重新点击按钮。
  7. " delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];  
  8. [alertView show];  
  9. [alertView release];  
  10. greetingLabel.text = @"";  
  11. return;  
  12. }  
  13. // 检查名字是不是超过16个字符,超过16个字符自动截断  
  14. if (nameString.length > 16) {  
  15. nameString = [nameString substringToIndex:16];  
  16. }  
  17. // 根据输入的名字,生成问候语  
  18. NSString *greeting = [NSString stringWithFormat:@"你好,%@!", nameString];  
  19. // 显示问候语  
  20. 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

iPhone应用程序 Say Hello实例操作

接下来,来实现将RootViewController作为文本输入框nameTextField的委托(delegate)

在视图控制器的头文件(RootViewController.h)中,在UIViewController后面添加<UITextFieldDelegate>:
 
@interface RootViewController : UIViewController<UITextFieldDelegate> {

这个申明表示视图控制器RootViewController将支持UITextFieldDelegate协议

在视图控制器的实现文件(RootViewController.m),实现 textFieldShouldReturn: 方法: 

  1. - (BOOL)textFieldShouldReturn:(UITextField *)textField {  
  2. if (nameTextField == textField) {  
  3. [nameTextField resignFirstResponder];  
  4. }  
  5. return YES;  

因为这个应用程序只有一个文本输入框,所以其实不需要包含nameTextField == textField检查。不过有些时候,对象可能会被设置成多个相同类型的对象的委托,这时候就需要来区分这些对象。

至此我们已经开发完成了整个应用程序。接下来将对它进行测试。

测试

这个应用程序相对简单,我们设计几个测试场景:

输入正常的名字,例如“宝玉”,然后点击按钮,看看是不是会显示“你好,宝玉!”

不输入任何名字,点击按钮,看看是不是会有提示信息,要求输入名字。

分别输入16个、17个、20个字符的名字,看看名字是不是最多只能显示前16个字符

点击文本输入框,显示键盘,点击键盘上的Done按钮,看键盘是不是会隐藏

针对这个测试场景,逐一做一下功能的测试,看起来结果和我们预期的完全一样。

iPhone应用程序 Say Hello实例操作 iPhone应用程序 Say Hello实例操作

小结:关于iPhone应用程序 Say Hello实例操作 (下篇)的内容介绍完了,希望本实例对你有所帮助。通过这样一个简单的项目,了解以下知识点: iOS开发常用的一些设计模式;iPhone程序的启动过程;视图控制器和Nib文件如何建立连接,这些知识对于iPhone开发和iOS开发来说,都是会经常用到的知识。

本文来自:http://www.cnblogs.com/dotey/archive/2011/06/09/2075954.html

责任编辑:zhaolei 来源: 博客园
相关推荐

2011-07-19 10:56:15

iPhone 控制器 视图

2011-07-19 10:42:41

iPhone 应用程序 模型

2011-07-26 11:13:15

iPhone PXL

2011-07-26 16:43:59

iPhone Web 服务器

2011-07-21 10:47:37

iPhone Cocoa 委托

2011-07-26 13:23:14

iPhone 图片 相册

2011-07-19 09:58:36

2011-07-26 10:09:08

iPhone 多语言 国际化

2011-08-05 13:49:53

iPhone 应用 开发

2011-08-12 14:54:45

iPhone委托

2011-07-21 15:56:32

iPhone 截屏

2011-07-27 17:30:40

iPhone Locate 定位

2011-07-19 14:36:32

iPhone

2011-07-26 09:41:23

iPhone xcode Mac OS X

2010-08-27 10:41:41

iPhone核心应用程序

2011-07-20 15:58:58

iPhone 应用程序 生命周期

2011-07-05 17:07:46

Qt 插件 模块

2011-07-06 16:25:10

iPhone 程序 调用

2010-09-10 09:50:33

iPhone软件iPhone

2011-08-10 16:50:10

iPhone生命周期
点赞
收藏

51CTO技术栈公众号