Cocoa开发:DungeonThing应用的构建与优化
立即解锁
发布时间: 2025-08-25 02:21:23 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从零开始的全面指南
### Cocoa开发:DungeonThing应用的构建与优化
在Cocoa开发中,构建一个功能完善且用户体验良好的应用需要多个步骤和技巧。下面将详细介绍如何构建和优化一个名为DungeonThing的应用。
#### 1. 界面布局与对象设置
首先,我们要对界面进行布局和对象设置。具体操作如下:
1. 点击窗口任意位置,然后按下⌘A选中窗口内所有视图。
2. 按下⌘D复制这些视图,会得到一组与原对象相同但位置稍有偏移且重叠的新对象。
3. 将这组新对象拖动到窗口中心,利用蓝色参考线确保它们与原对象处于同一垂直位置,并使各个框之间有合适的水平间距。
4. 再次按下⌘D,将第三组对象拖动到窗口右侧,同样借助蓝色参考线进行正确定位。
5. 双击两个新按钮,分别将它们的标题改为“Generate Monster”和“Generate Dungeon”。根据之前设置的调整约束,可能需要将框的大小重置为227 x 247。
#### 2. 连接到DungeonThingAppDelegate
完成界面布局后,需要将相关元素连接到DungeonThingAppDelegate。操作步骤如下:
1. 点击工具栏中Editor组里类似管家的小图标(或使用快捷键⌥⌘↵)打开Assistant Editor面板,并从Jump Bar中选择DungeonThingAppDelegate.h。
2. 依次从“Generate Character”按钮下方框内的标签开始,按住Control键拖动到Assistant Editor中的DungeonThingAppDelegate.h文件,放置在预定义的窗口@property下方。当出现一个小窗口提示可以创建新的outlet或action时,释放鼠标,创建名为characterLabel的新outlet。
3. 对窗口中另外两个框内的标签执行相同操作,分别创建名为monsterLabel和dungeonLabel的新outlet。
4. 从三个按钮分别按住Control键拖动回Assistant Editor中的DungeonThingAppDelegate.h文件,创建名为createCharacter:、createMonster:和createDungeon:的新action。这样做不仅会在DungeonThingAppDelegate.h文件中添加outlet和action,还会在DungeonThingAppDelegate.m文件中为这些action添加方法存根。
#### 3. 定义常量
此时,图形用户界面(GUI)已完成,相关绑定也已配置好,使得偏好设置窗口中的控件值能保存到用户的应用偏好中。接下来要定义一些常量,以匹配我们在nib文件中为偏好设置键名所设置的所有值。将以下代码插入到DungeonThingAppDelegate.m文件的顶部:
```objc
#define kCharacterMaxNameLength @"characterMaxNameLength"
#define kCharacterStatsGenerationPolicy \
@"characterStatsGenerationPolicy"
#define kCharacterClassAllowedPaladin @"characterClassAllowedPaladin"
#define kCharacterClassAllowedBard @"characterClassAllowedBard"
#define kCharacterClassAllowedFighter @"characterClassAllowedFighter"
#define kCharacterClassAllowedCleric @"characterClassAllowedCleric"
#define kCharacterClassAllowedRogue @"characterClassAllowedRogue"
#define kCharacterClassAllowedMonk @"characterClassAllowedMonk"
#define kCharacterClassAllowedMagicUser \
@"characterClassAllowedMagicUser"
#define kCharacterClassAllowedThief @"characterClassAllowedThief"
#define kMonsterBootyFrequency @"monsterBootyFrequency"
#define kMonsterTypeAllowedOrc @"monsterTypeAllowedOrc"
#define kMonsterTypeAllowedGoblin @"monsterTypeAllowedGoblin"
#define kMonsterTypeAllowedOgre @"monsterTypeAllowedOgre"
#define kMonsterTypeAllowedSkeleton @"monsterTypeAllowedSkeleton"
#define kMonsterTypeAllowedTroll @"monsterTypeAllowedTroll"
#define kMonsterTypeAllowedVampire @"monsterTypeAllowedVampire"
#define kMonsterTypeAllowedSuccubus @"monsterTypeAllowedSuccubus"
#define kMonsterTypeAllowedShoggoth @"monsterTypeAllowedShoggoth"
#define kDungeonTunnelTwistiness @"dungeonTunnelTwistiness"
#define kDungeonMonsterFrequency @"dungeonMonsterFrequency"
#define kDungeonTreasureFrequency @"dungeonTreasureFrequency"
```
需要注意的是,为了适应书籍格式,部分行使用了反斜杠进行换行,在实际代码中可省略这种手动换行,将每个#define写成一行声明。
#### 4. 指定默认偏好设置值
在实现动作方法之前,需要了解NSUserDefaults类,它可以让我们以类似哈希表或字典的方式存储和检索用户的应用偏好,键为我们自定义的字符串。每个应用都应该为NSUserDefaults创建一组默认值,以防用户未为某个键设置值。在DungeonThingAppDelegate中创建如下方法:
```objc
+ (void)initialize
{
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:1], kMonsterBootyFrequency,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedOrc,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedGoblin,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedOgre,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedSkeleton,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedTroll,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedVampire,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedSuccubus,
[NSNumber numberWithBool:YES], kMonsterTypeAllowedShoggoth,
[NSNumber numberWithInt:7], kCharacterMaxNameLength,
[NSNumber numberWithInt:1], kCharacterStatsGenerationPolicy,
[NSNumber numberWithBool:YES], kCharacterClassAllowedPaladin,
[NSNumber numberWithBool:YES], kCharacterClassAllowedBard,
[NSNumber numberWithBool:YES], kCharacterClassAllowedFighter,
[NSNumber numberWithBool:YES], kCharacterClassAllowedCleric,
[NSNumber numberWithBool:YES], kCharacterClassAllowedRogue,
[NSNumber numberWithBool:YES], kCharacterClassAllowedMonk,
[NSNumber numberWithBool:YES], kCharacterClassAllowedMagicUser,
[NSNumber numberWithBool:YES], kCharacterClassAllowedThief,
[NSNumber numberWithInt:3], kDungeonTunnelTwistiness,
[NSNumber numberWithInt:7], kDungeonMonsterFrequency,
[NSNumber numberWithInt:1], kDungeonTreasureFrequency,
nil]];
}
```
这个方法调用了NSUserDefaults的registerDefaults:方法,传入一个包含应用默认值的字典,确保我们在请求某个键的值时总能得到有意义的结果。
#### 5. 创建动作方法
接下来实现动作方法。首先是createCharacter:方法,它将显示与角色创建相关的所有偏好设置值的摘要:
```objc
- (IBAction)createCharacter:(id)sender {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableString *result = [NSMutableString stringWithCapacity:1024];
[result appendString:
@"G
```
0
0
复制全文