深入探索DungeonThing开发:从界面搭建到数据管理
立即解锁
发布时间: 2025-08-21 01:08:27 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
### 深入探索 Cocoa 绑定:构建 DungeonThing 应用程序
#### 1. 界面布局与对象复制
在开发 DungeonThing 应用程序时,首先要对界面进行布局。可以通过以下步骤操作:
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. 逐个进行操作,按住 Control 键,从 Generate Character 按钮下方盒子里的标签拖动到 Assistant Editor 中的 DungeonThingAppDelegate.h 文件,放置在预定义的 window 的 @property 下方。当出现一个小窗口提示可以创建新的出口(outlet)或动作(action)时,释放鼠标,创建名为 characterLabel 的新出口。
3. 对窗口中另外两个盒子里的标签重复上述操作,分别创建名为 monsterLabel 和 dungeonLabel 的新出口。
4. 按住 Control 键,将三个按钮分别拖动回 Assistant Editor 中的 DungeonThingAppDelegate.h 文件,创建名为 createCharacter:、createMonster: 和 createDungeon: 的新动作。这样做不仅会在 DungeonThingAppDelegate.h 文件中添加出口和动作,还会在 DungeonThingAppDelegate.m 文件中为这些动作添加方法存根。
#### 3. 定义常量
当 GUI 完成且相关绑定配置好后,接下来要定义一些常量。这些常量与 nib 文件中为偏好设置的键名所设置的所有值相匹配,将其插入到 DungeonThingAppDelegate.m 文件的顶部:
```objective-c
#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 中创建一个 `initialize` 类方法来设置这些默认值:
```objective-c
+ (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:` 方法,它将显示与角色创建相关的所有偏好设置值的摘要:
```objective-c
- (IBAction)createCharacter:(id)sender {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableString *result = [NSMutableString stringWithCapacity:1024];
[result appendString:
@"Generating a character within these parameters:\n"
"-----------------\n"];
[result appendFormat:
@"Maximum name length: %ld\n",
[ud integerForKey:kCharacterMaxNameLength]];
[result appendFormat:
@"Stats generation policy: %ld\n",
[ud integerForKey:kCharacterStatsGenerationPolicy]];
[result appendFormat:
@"Allows Paladin: %@\n",
[ud boolForKey:kCharacterClassAllowedPaladin] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Bard: %@\n",
[ud boolForKey:kCharacterClassAllowedBard] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Fighter: %@\n",
[ud boolForKey:kCharacterClassAllowedFighter] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Cleric: %@\n",
[ud boolForKey:kCharacterClassAllowedCleric] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Rogue: %@\n",
[ud boolForKey:kCharacterClassAllowedRogue] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Monk: %@\n",
[ud boolForKey:kCharacterClassAllowedMonk] ? @"YES" : @"NO"];
[result appendFormat:
@"Allows Magic-User: %@\n",
[ud boolForKey:kCharacterClassAllowedMagicUser] ? @"YES" : @"NO"];
[result ap
```
0
0
复制全文
相关推荐









