构建反派追踪应用的GUI组件指南
立即解锁
发布时间: 2025-08-21 01:08:26 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
### 构建反派追踪应用的 GUI 组件
#### 1. 准备工作与编码起步
在完成 GUI 布局后,就可以开始实现应用的核心功能了。对于 VillainTracker 应用,这些功能将主要在 `VillainTrackerAppDelegate` 类中实现。在开始编写实际代码之前,有两件重要的事情需要完成。
首先,需要对模型对象的属性访问键名进行标准化。这是因为无论是简单的字典存储方式,还是使用更复杂的真实模型对象,标准化键名都能确保正确访问模型对象的属性。具体做法是使用标准 C 预处理器宏来定义键名,这些键名在编译时会被替换为 `NSString` 实例。这样做不仅能避免键名拼写错误,还能利用 Xcode 的代码补全功能。以下是定义的键名代码,应放置在 `VillainTrackerAppDelegate.m` 文件的顶部:
```objc
#define kName @"name"
#define kLastKnownLocation @"lastKnownLocation"
#define kLastSeenDate @"lastSeenDate"
#define kSwornEnemy @"swornEnemy"
#define kPrimaryMotivation @"primaryMotivation"
#define kPowers @"powers"
#define kPowerSource @"powerSource"
#define kEvilness @"evilness"
#define kMugshot @"mugshot"
#define kNotes @"notes"
```
然后,需要创建一个包含用户可编辑属性的默认反派对象。这里不创建“真正”的模型类,而是使用 `NSMutableDictionary` 来简化操作。在 `NSApplication` 委托方法 `applicationDidFinishLaunching:` 中创建这个字典对象,代码如下:
```objc
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
self.villain = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
@"Lex Luthor", kName,
@"Smallville", kLastKnownLocation,
[NSDate date], kLastSeenDate,
@"Superman", kSwornEnemy,
@"Revenge", kPrimaryMotivation,
[NSArray arrayWithObjects:@"Evil Genius", nil], kPowers,
@"Superhero action", kPowerSource,
@9, kEvilness,
[NSImage imageNamed:@"NSUser"], kMugshot,
@"", kNotes,
nil];
}
```
此代码为大家熟知的默认反派设置了所有属性。`initWithObjectsAndKeys:` 方法用一个以 `nil` 结尾的键值对列表填充字典。这里的 `@9` 是 `[NSNumber numberWithInt:9]` 的简写。需要注意的是,`mugshot` 属性被设置为一个预存在的 `NSImage` 实例,这是 Cocoa 中包含的可用于应用的图像之一。此时可以在 Xcode 中编译应用,确保目前的代码没有问题,但暂时运行应用还看不到实际效果,因为 GUI 虽然创建好了,但还未填充数据。
这里可能有人会疑惑,为什么将 `NSApplication` 委托的初始化代码放在 `applicationDidFinishLaunching:` 方法中,而不是 `init` 方法。这是因为从应用主 nib 文件加载的对象处于特殊情况:它们是应用自身初始化例程的子步骤,这意味着在主 nib 文件中的任何对象调用 `init` 方法时,`NSApplication` 本身可能尚未完全初始化,这对用户界面影响很大。因此,通常最好将初始化推迟到一切准备就绪。由于 `VillainTrackerAppDelegate` 被设置为 `NSApplication` 的委托,通过实现 `applicationDidFinishLaunching:` 方法就能方便地知道应用何时真正准备好。
#### 2. 显示反派数据
前面创建了反派对象,但如果现在构建并运行应用,窗口上的控件都是空白的,因为还没有用反派属性的值填充它们。接下来要在 `VillainTrackerAppDelegate` 类中创建一个新的私有方法 `updateDetailViews`,用于设置所有 GUI 对象来显示当前反派的属性。将这个功能封装在一个单独的方法中,这样不仅在应用启动时可以使用,在需要刷新视图时也能调用。
首先,创建 `updateDetailViews` 方法的简单“存根”。为了让该方法在类内部可访问,但外部不可访问,不在 `.h` 文件的 `@interface` 声明中添加它,而是在 `VillainTrackerAppDelegate.m` 文件底部的 `@end` 声明之前插入以下代码:
```objc
- (void)updateDetailViews {
}
```
在开始实现这个方法之前,需要确保能调用它,在 `applicationDidFinishLaunching:` 方法的末尾插入以下代码:
```objc
// insert this at the end of applicationDidFinishLaunching:
[self updateDetailViews];
```
快速编译一下,确保目前的代码能干净地编译通过,然后就可以开始实现 `updateDetailViews` 方法,在窗口中看到反派数据了。
##### 2.1 设置简单值
首先设置显示反派姓名和最后已知位置的两个 `NSTextField`。`NSTextField` 可以直接接受数字和其他类型的输入,这里使用 `setStringValue:` 方法传递简单的字符串。将以下代码放在 `updateDetailViews` 方法的开头:
```objc
[self.nameView setStringValue:[self.villain objectForKey:kName]];
[self.lastKnownLocationView setStringValue:
[self.villain objectForKey:kLastKnownLo
```
0
0
复制全文
相关推荐









