15 AppKit简介

说明:Application Kit中包含Cocoa中关于用户界面的大量资源。
注意:学习这一章节时,Xcode的最新版本是7.2,部分知识已经过时。比如目前storyboard已经基本取代了xib

15.1 构建项目

说明:下面是通过Xcode构建Cocoa应用程序项目的步骤。

  1. File->New->New Project(Create a New Xcode Project)
  2. 左边列表Mac OS X下的Application选项->Cocoa Application->Next
  3. 项目信息
  • Product Name:应用名称
  • Company Identifier:企业标识符,用来区分应用程序
  • Class Prefix:伪命名空间,避免文件名冲突
  1. 复选框
  • Create Document-Based Application
  • Use Core Data
  • Include Unit Test
  • Use Automatic Reference Counting

15.2 创建委托文件@interface部分

Interface Builder简称IB,用可视化的方式为OS XiOS布局窗口内容,构建用户界面。
IBOutletIBAction这两个关键字会经常出现在代码中,用于

  • Interface Builder提供标记
  • 帮助阅读代码

15.3 Interface Builder

说明:通过.xib文件就可以打开IB的可视化编辑器。

  • nib文件:编译时,.xib(XML格式)文件会被编译为nib(NeXT Interface Builder)文件,它是包含了压缩对象的二进制文件,
  • 对象库:包含了大量可以拖入窗口的不同类型的对象。

Alt text

15.4 设计用户界面

说明:对用户界面进行布局

  1. 拖入一个Text Filed
  2. 拖入一个Label
  3. 拖入一个push button

Alt text

15.5 创建连接

说明:代码与刚创建的用户界面元素相连接。

15.5.1 连接输出口(IBOutlet)

说明:通过拖动自动生成界面元素对应的代码。以其中的Text Field为例子

  1. 打开辅助编辑器
  2. 按住Control键将光标从文本框拖动到头文件@property那一行的下面
  3. 出现Insert Outlet orAction提示消息时松开鼠标
  4. 在弹出的对话框中输入textField,点击Connect

15.5.2 连接操作(IBAction)

说明:将按钮连接到操作,这样按下按钮就会触发代码。以UpperCae按钮为例

  1. 按住Control键和UpperCase按钮
  2. 拖动一条直线到头文件的最后一行@property语句下
  3. 弹出连接对话框,选择Action类型
  4. 在Name文本框中输入uppercase,并点击Connect(自动在头文件中创建方法的声明,并在实现文件中创建方法的实现)

15.6 应用程序委托的实现

说明:IBOutlet的工作方式

  1. 应用程序启动时,MainMenu.nib被自动加载,界面对象被创建
  2. 分配并初始化MSCApplelegate实例(IBOutlet的实例变量)
  3. 建立连接:将NSTextField等对象的地址添加到MSCAppDelegate实例变量中,然后像每个每个界面对象发送awakeFromNib消息。

MSCAppDelegate.h

1
2
3
4
5
6
7
8
9
10
11
12
#import <Cocoa/Cocoa.h>

@interface MSCAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
@property (weak) IBOutlet NSTextField *resultsField;

- (IBAction)uppercase:(id)sender;
- (IBAction)lowercase:(id)sender;

@end

MSCAppDelegate.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#import "MSCAppDelegate.h"

@implementation MSCAppDelegate

@synthesize window = _window;
@synthesize textField = _textField;
@synthesize resultsField = _resultsField;

- (id)init {
if (nil != (self = [super init])) {
// 此时还没和界面对象建立连接,因此都是 nil
NSLog (@"init: text %@ / results %@", _textField, _resultsField);
}

return self;
}

/**
* 对界面对象进行一些初始化工作
* 连接建立后会被调用
* @override
*/

- (void)awakeFromNib {
NSLog (@"awake: text %@ / results %@", _textField, _resultsField);

[_textField setStringValue:@"Enter text here"];
[_resultsField setStringValue:@"Results"];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
}

- (IBAction)uppercase:(id)sender {
NSString *original = [_textField stringValue];
NSString *uppercase = [original uppercaseString];
[_resultsField setStringValue:uppercase];
}

- (IBAction)lowercase:(id)sender {
NSString *original = [_textField stringValue];
NSString *lowercase = [original lowercaseString];
[_resultsField setStringValue:lowercase];
}

@end

15.7 小结