iPhone起步-1: "Hello,World!" in iPhone Development

 

1.认识Xcode和Interface Builder(IB)

 

2.MVC泛型
MVC模型将所有功能划分为3种:
模型:保存应用程序数据的类。
视图:窗口、控件和其他用户可以看到并能与之交互的元素的组成部分。
控制器:将模型和试图绑定在一起,确定如何处理用户输入的应用程序逻辑。

 

3.基本概念
属性声明:@property (retain, nonatomic) IBOutlet UIButton *myButton;
属性实现:@synthesize myButton;
输出口(outlet): 控制器类可以使用输出口(通过关键字IBOutlet声明的实例变量)来引用nib中的对象。
操作:nib文件中的界面对象触发控制器类中的特殊方法,通过关键字IBAction声明的方法。例如: - (IBAction) doSomething: (id)sender;

 

4.Hello,World示例
我们将创建一个很简单的iPhone程序作为我们iPhone之旅的"Hello,World".
界面如下图所示,

触摸Button时,将弹出一个提示框(alert),提示框的内容为TextField中的输入。


步骤如下:
启动Xcode,创建一个名为"HelloiPhone",基于iPhone OS | Application | View-based Application项目模板的应用程序。
打开控制器类头文件HelloiPhoneViewController.h的,添加属性和方法声明:

 

//
// HelloiPhoneViewController.h
// HelloiPhone
//
// Created by Elf Sundae on 11/4/10.
// Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.
//

#import
<UIKit/UIKit.h>

@interface HelloiPhoneViewController : UIViewController
{
UITextField
* textField;
}

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

- (IBAction) buttonPressed: (id)sender;

@end

 

在Groups & Files窗格下的Resources下,双击 HHelloiPhoneViewController.xib ,将打开Interface Builder。

 

选择菜单 Tools | Library(command + Shift + L),从Library下的Objects拖动一个Text Field和一个Round Rect Button到View。双击button改名为“OK”。
按着Ctrl键,从IB主窗口的File's Owner拖一条线到View的Text Field,在弹出的窗口选择textField。
鼠标点选View中button,按command+2或者菜单选择"Tools | Connetions Inspector",从Event中的Touch Up Inside后面的小圆圈拉一条线连接到主窗口的File's Owner,并在弹出窗口中选择“buttonPressed:”。以上拖拽动作称为“连接”,将我们在类控制器中声明的IBOutlet和IBAction连接到IB视图中控件或方法。


下来回到Xcode实现控制器类:

1//
2// HelloiPhoneViewController.m
3// HelloiPhone
4//
5// Created by Elf Sundae on 11/4/10.
6// Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.
7//
8
9#import "HelloiPhoneViewController.h"
10
11@implementation HelloiPhoneViewController
12
13@synthesize textField;
14
15- (IBAction) buttonPressed: (id)sender
16{
17 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello,iPhone!"
18 message:self.textField.text
19 delegate:nil
20 cancelButtonTitle:@"OK!"
21 otherButtonTitles:nil];
22 [alert show];
23 [alert release];
24}
25
26- (void)didReceiveMemoryWarning {
27 // Releases the view if it doesn't have a superview.
28 [super didReceiveMemoryWarning];
29
30 // Release any cached data, images, etc that aren't in use.
31}
32
33- (void)viewDidUnload {
34 // Release any retained subviews of the main view.
35 // e.g. self.myOutlet = nil;
36 self.textField = nil;
37}
38
39
40- (void)dealloc {
41 [textField release];
42 [super dealloc];
43}
44
45@end

 

运行iPhone模拟器测试后发现键盘不能自动关闭。下面来解决这个问题,让输入完后按键盘上的return即可关闭,或者触摸背景关闭键盘(数字键盘上没有return键,iphone程序常设计为触摸背景关闭键盘输入状态)。

 

完成输入后关闭键盘
当用户按下return键时,将生成一个Did End On Exit事件,此时我们需要让textField取消控件已关闭键盘。
用户当前正在与之交互的控件称为第一响应者(firstResponder)。
方法 - (BOOL)resignFirstResponder 使触发此操作的控件取消第一响应者状态。

我们在控制器类头文件中声明方法:

- (IBAction) textFieldDoneEditing: (id)sender;

保存项目后在IB中将textField的Did End On Exit事件连接到此方法。保存IB返回Xcode实现此方法:

- (IBAction) textFieldDoneEditing: (id)sender
{
// 消第一响应者状态
[sender resignFirstResponder];
}

 

重新编译并运行,发现可以通过按下return键来完成输入了!

 
通过触摸背景关闭键盘
并非所有键盘布局都有return键,例如数字键盘。苹果公司的iPhone程序是这样做的:在大多数有textField的情况下,在试图中任何无活动控件的位置按下手指都可让键盘消失。实现此功能非常简单,只要创建一个不可见的按钮,将其置于其他所有元素的后面,用于通知textField在检测到触摸操作时生成第一响应者状态。

// 通过触摸屏幕关闭键盘
- (IBAction) backgroundTap: (id)sender
{
// 在非第一响应者控件上调用resignFirstResponder是绝对安全的。
// 因此可以放心的对所有textField调用resignFirstResponder
[textField resignFirstResponder];
}

保存代码来到IB。我们现在需要更改nib试图的底层类。
在IB主窗口中单击选择View,command+4 调出身份检查器。将标有Class的字段由UIView更改为UIControl。能够触发操作方法的所有控件都是UIControl的子类,所以通过更改底层类,此View将能够触发操作方法。
现在按command + 2 应该能看到Event。将Touch Down事件连接到File's Owner的backgroundTap:操作。
保存IB返回Xcode后编译并运行,可以看到触摸视图中没有活动控件的任何位置(屏幕背景或lable等控件)都将触发backgroundTap:操作。

 

应用程序图标

应用程序图标为57×57都PNG文件,iPhone将自动将边缘圆角化并让它具有玻璃质感。默认情况下,SDK会搜寻名为icon.png的资源并使用它作为应用程序图标。如果你都图标文件不叫icon.png,可以在plist中添加图标属性,方法为:将图标文件添加到项目Resources文件夹中,打开项目-Info.plist,在Icon file中填入图标文件名。

 

代码整理

 

HelloiPhoneViewController.h
1 //
2  // HelloiPhoneViewController.h
3  // HelloiPhone
4  //
5 // Created by Elf Sundae on 11/4/10.
6 // Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.
7 //
8
9 #import <UIKit/UIKit.h>
10
11 @interface HelloiPhoneViewController : UIViewController
12 {
13 UITextField * textField;
14 }
15
16 @property (retain, nonatomic) IBOutlet UITextField *textField;
17
18 - (IBAction) buttonPressed: (id)sender;
19 - (IBAction) textFieldDoneEditing: (id)sender;
20 - (IBAction) backgroundTap: (id)sender;
21
22 @end
HelloiPhoneViewController.m
1 //
2 // HelloiPhoneViewController.m
3 // HelloiPhone
4 //
5 // Created by Elf Sundae on 11/4/10.
6 // Copyright 2010 Elf.Sundae(at)Gmail.com. All rights reserved.
7 //
8
9 #import "HelloiPhoneViewController.h"
10
11 @implementation HelloiPhoneViewController
12
13 @synthesize textField;
14
15 - (IBAction) buttonPressed: (id)sender
16 {
17 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello,iPhone!"
18 message:self.textField.text
19 delegate:nil
20 cancelButtonTitle:@"OK!"
21 otherButtonTitles:nil];
22 [alert show];
23 [alert release];
24 }
25
26 - (IBAction) textFieldDoneEditing: (id)sender
27 {
28 // 取消textField第一响应者状态
29 [sender resignFirstResponder];
30 }
31
32 // 通过触摸屏幕关闭键盘
33 - (IBAction) backgroundTap: (id)sender
34 {
35 // 在非第一响应者控件上调用resignFirstResponder是绝对安全的。
36 // 因此可以放心的对所有textField调用resignFirstResponder
37 [textField resignFirstResponder];
38 }
39 - (void)didReceiveMemoryWarning {
40 // Releases the view if it doesn't have a superview.
41 [super didReceiveMemoryWarning];
42
43 // Release any cached data, images, etc that aren't in use.
44 }
45
46 - (void)viewDidUnload {
47 // Release any retained subviews of the main view.
48 // e.g. self.myOutlet = nil;
49 self.textField = nil;
50 }
51
52
53 - (void)dealloc {
54 [textField release];
55 [super dealloc];
56 }
57
58 @end

 

项目下载

posted @ 2010-11-10 23:50  Elf Sundae  阅读(2060)  评论(0编辑  收藏  举报