chapter 1
虽然从事C语言开发BIOS工作,但是依旧被面向对象的快捷方便所吸引。
接下来静下心来,准备学习学习iOS编程,希望来年能够从事iOS开发工作,希望能够做一个愉快的码农,并且能够继续深入研究数据结构和算法。
摒弃速成的培训班视频,入手老美的一本《iOS编程》,从点滴做起,犹如当初学习C语言,对Objective-C保持热情!
在成为iOS程序员,必须克服三道难题:
- 必须学会Objecitve-C语言。
- 必须掌握Cocoa的常用技术。
- 必须掌握框架(framework)。
第一个简单的iOS应用
首先尝试编写一个简单的iOS应用——Quiz。功能如下:在视图显示一个问题,用户点击视图下方的按钮,可以显示相应的答案,用户点击上方的按钮,则会显示一个新问题。
两个基本问题:
1. 如何创建并设置对象
2. 如何处理用户交互
MVC模式
- 视图对象是用户可以看见的对象。在Quiz应用中,显示问题和答案的标签以及标签下方的按钮都是视图对象。
- 模型对象负责存储数据,与用户界面无关。Quiz应用中的模型对象是两个包含字符串对象的数组:questions数组和answers数组。
控制器对象用于控制视图对象为用户呈现的内容,以及负责确保视图对象和模型对象的数据保持一致。
Quiz
四个视图对象:两个UILabel对象和两个UIButton对象
- 两个控制对象:AppDelegate和QuizViewController的对象各一个
- 两个模型对象:NSArray对象两个
tips:对于delefate的用法还有些疑问?
首先从.xib文件学习拖控件开始:
构建项目时,所有XIB文件都会被编译为NIB文件,然后Xcode会将NIB文件拷贝至应用的程序包中。程序包其实就是目录,其中包含应用的可执行文件和其会用到的所有资源文件。
通过在XIB文件拖动控件(在Interface Builder一种可视化编辑器,可以用拖动对象的方式来创建图形用户界面),已经简单将view界面建立起来了,但是现在他还不具有任何功能,接下来我们需要将QuizViewController和视图关联起来。
关联,一个对象可以知道另一个对象在内存的位置,从而使这两个对象协同工作。
- 插座关联(outlets):指向对象的指针
- 动作(actions):一种方法,这种方法在视图对象和用户对象发生交互时会被调用
// 声明一个插座变量,指向一个UILabel对象。IBOutlet关键字告诉Xcode之后会使用Interface Builder关联该插座变量。
@property (nonatomic, weak) IBOutlet UILabel *questionLabel;
@property (nonatomic, weak) IBOutlet UILabel *answerLabel;
声明动作方法:showQuestion:和showAnswer:
// IBAction关键字告诉Xcode之后会使用Interface Builder关联动作
- (IBAction)showQuestion:(id)sender{
// 进入下一个问题
self.currentQuestionIndex++;
// 是否已经回答完所有的问题?
if(self.currentQuestionIndex == [self.questions count]){
self.currentQuestionIndex = 0;
}
// 根据正在回答的问题序号从数组中取出问题字符串
NSString *question = self.questions[self.currentQuestionIndex];
// 将问题字符串显示在标签上
self.questionLabel.text = question;
// 重置问题的答案是什么?
self.answerLabel.text = @"???";
}
- (IBAction)showAnswer:(id)sender{
// 当前问题答案是什么?
NSString *answer = self.answers[self.currentQuestionIndex];
// 在答案标签上显示相应答案
self.answerLabel.text = answer;
}
创建模型对象
// 为了确保用户在看到应用界面时,数组已经存储了所需的问题和答案,必须在QuizViewController对象创建完毕之后立即创建数组。
- (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;
}
屏幕上显示视图控制器
已经成功将两个Label和两个Button和ViewController关联起来,但是为了在屏幕上显示用户界面,必须将视图控制器和应用中另一个控制器关联(AppDelegate)。
重点:在使用Xcode开发iOS应用时,所有的应用模板都会自动帮读者创建一个应用程序委托,它是每一个iOS应用都必须具备的启动入口。应用程序委托负责管理应用的UIWindow对象。UIWindow对象表示应用唯一的根视图控制器(root view controller)。
在AppDelegate中application: didFinishLaunchingWithOptions:这条消息添加应用的初始化代码。
QuizViewController *quizVC = [[QuizViewController alloc] init];
self.window.rootViewController = quizVC;
ok!大功告成!
Quetion:对于显示分辨率不正确的问题还有待继续学习!