第31章 第一个iOS应用
输入公司标志(Company Identifier)是为了生成Bundle Identifier(程序包标志),它的作用是保证应用在App Store中的唯一性。
Class Prefix(类名前缀)
AppDelegate
创建项目之后,Xcode会自动创建AppDelegate类,称为应用程序委托,它是程序的起点,每个iOS应用都有一个应用程序委托。
UIWindow 对象构成iOS应用的屏幕。
Model-View-Controller
Model-View-Controller(模型,视图,控制器,MVC)是一种设计模式,核心理念是:开发程序时所创建的类,都应该可以归为模型、视图或控制器三种类型。下面对这三种类型做一个简单的介绍。
- 模型负责保存数据,并能让其他对象访问这些数据。模型不处理用户界面,也无法将自己“画”在屏幕上。模型唯一需要完成的任务是保存并管理数据。苹果公司提供的NSString对象、NSDate对象和NSArray对象都是模型对象。
- 视图是应用中的可见元素,知道如何在屏幕上画出自己,并相应用户输入。视图和其显示的数据没有直接的关联,也不负责数据的保存和管理。UIView对象和众多的UIView子类对象都是常见的视图对象。
- 控制器负责执行程序的逻辑功能,以连接和驱动应用的不同组成部分。控制器可以处理事件,并能与应用中的其他对象协同工作。应用中的控制器对象大都需要完成很多烦琐的工作。
应用委托对象
iOS应用启动时,会在“幕后”完成大量的设置任务。在这一过程中,程序会创建一个UIApplication实例,用于控制应用的状态。UIApplication实例也是应用和操作系统之间的“联络人”。此外,程序还会创建AppDelegate实例,并将其设置为UIApplication实例的委托对象。这也是为什么这类对象会被称为应用委托对象(app delegate)。
有的视图对象也是控件(controls)。控件是可以与用户进行交互的视图,例如,按钮、滑块和输入框。
当屏幕所显示的视图包含这类控件时,其中的某个控件可以成为第一响应对象(first responder)。拥有第一响应对象状态的控件,可以处理来自键盘的文字输入及摇动事件。
当用户和某个控件产生交互,并且成为第一响应对象时,这个控件就会收到becomeFirstResponder
消息。当接受文本输入的控件成为第一响应对象时,屏幕会出现一个键盘。
成为第一响应对象的对象能够接受来自键盘的输入和摇动时间,并且会保持这一状态,直到另一个UIControl对象成为第一响应对象,或者是自己受到resignFirstResponder
消息。
// 返回保存用户任务数据的文件路径
NSString *BNRDocPath() {
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [pathList[0] stringByAppendingString:@"data.td"];
}
// 将数据保存至文件
[self.tasks writeToFile:BNRDocPath() atomically:YES];
// 加载数据
NSArray *plist = [NSArray arrayWithContentsOfFile:BNRDocPath()];
深入学习:main() 的作用
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain()函数会创建若干对象,使应用得以运行。首先,该函数会创建一个UIApplication类的实例(单利对象)。接着,根据传入的第四个实参(最后一个实参)创建相应的类实例,并将其设置为应用的委托对象。该对象会受到各种应用委托消息,例如,内存过低警告、应用关闭、进入后台运行状态或应用启动完毕。
以上流程也可以解释程序是如何从main()
函数到`application:didFinishLaunchingWithOpt
第32章 第一个Cocoa应用
@property (nonatomic) IBOutlet NSTableView *taskTable;
- (IBAction)addTask:(id)sender;```
IBOutlet 告诉 Xcode,taskTable指针会通过Interface Builder 而不是编写代码来进行赋值。IBAction 告诉Xcode,addTask:是一个动作方法,会通过Interface Builder 而不是编写代码来配置相应的目标-动作对。
以下是IBAction 的实际定义:
define IBAction void```
这个语句告诉你 IBAction 会在正式编译前被替换为void。所有 IBAction 关键字都会被替换为void,因为界面控件所触发的动作方法不需要返回值。
“Outlet”是“对象指针”的另一个名字。
和 IBAction 不一样,IBOutlet 会在正式编译前彻底消失。
#define IBOutlet```
因此,在编译时刻,IBOutlet关键字会被彻底移除,只留下outlet(指针)。
网友评论