首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》1.7 创建模型对象

关灯直达底部

视图对象构成了用户界面,开发者通常在Interface Builder中创建、设置和关联视图对象。而模型对象则是通过编写代码创建的。

在项目导航面板中选择BNRQuizViewController.m文件。添加以下代码,声明一个整型变量和两个数组对象:

@interface BNRQuizViewController

@property (nonatomic) int currentQuestionIndex;

@property (nonatomic, copy) NSArray *questions;

@property (nonatomic, copy) NSArray *answers;

@property (nonatomic, weak) IBOutlet UILabel *questionLabel;

@property (nonatomic, weak) IBOutlet UILabel *answerLabel;

@end

@implementation BNRQuizViewController

- (IBAction)showQuestion:(id)sender

{

}

- (IBAction)showAnswer:(id)sender

{

}

@end

两个数组用于存储一系列问题和答案,而整型变量用于跟踪用户正在回答的问题。

为了确保用户在看到应用界面时,数组已经存储了所需的问题和答案,必须在BNRQuizViewController对象创建完毕之后立即创建数组。

BNRQuizViewController对象创建完毕之后会收到消息:initWithNibName:bundle:。请读者在BNRQuizViewController.m文件中实现initWithNibName: bundle:方法。

...

@property (nonatomic, weak) IBOutlet UILabel *answerLabel;

@end

@implementation BNRQuizViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil

bundle:(NSBundle *)nibBundleOrNil

{

// 调用父类实现的初始化方法

self = [super initWithNibName:nibNameOrNil

bundle:nibBundleOrNil];

if (self) {

// 创建两个数组对象,存储所需的问题和答案

// 同时,将questions和answers分别指向问题数组和答案数组

self.questions = @[@"From what is cognac made?",

@"What is 7+7?",

@"What is the capital of Vermont?"];

self.answers = @[@"Grapes",

@"14",

@"Montpelier"];

}

// 返回新对象的地址

return self;

}

...

@end

(现在读者不用理解代码,第2章将介绍更多关于Objective-C语言的知识。)

使用代码补全功能

读者在阅读本书的过程中,需要输入大量的代码。Xcode会在读者输入代码时,自动填入部分代码。例如,输入initWithNibName:bundle:的前几个字符,Xcode会显示相应的提示并将其列为备选项。按回车键,就可以将这个备选项写入代码,也可以在Xcode显示的下拉列表中选择其他的备选项。

如果选中的备选项对应的是带实参的方法,那么Xcode会在实参的位置放置占位符。(请读者注意,这里的占位符和之前XIB文件中介绍的占位符对象完全不是一回事。)

占位符不是真正的代码,必须将其替换成实际的代码。因为占位符的名称通常会和实参的名称相同,所以初学者很容易产生混淆:代码看上去完全正确,但是编译时会出错。

图1-21显示的是读者在输入上述代码时,可能会碰到的两个占位符。

图1-21 代码补全时的占位符示例和错误示例

在图1-21中,initWithNibName:bundle:的第一行实现中的nibNameOrNil和nibBundleOrNil都是占位符。Xcode在显示占位符时,会将带特殊颜色的圆角矩形作为其背景,所以很容易辨认。要修正这类错误,需要选择占位符,输入真正的实参。这样,之前的圆角矩形背景就会消失,代码也能通过编译。

读者在这里可以直接使用占位符的名称作为实参名称。只要选中占位符再按下回车键就可以了,Xcode会自动填入相同的实参名称。

在使用代码补全功能时,Xcode经常会给出和实际需要不同的代码但又很类似的备选项。Cocoa Touch所使用的命名约定(naming convention)会导致不同的方法、类型和变量拥有类似的名称。因此,请读者一定要注意检查,不要不经确认就选择Xcode给出的第一个备选项。