我是Objective-C的新手;但是已经编码多年了,这个真的让我感到难过。
我正在尝试构建一个iPhone应用程序,并希望创建一个使用Table格式的“设置”屏幕。 (Xcode 5.1.1)。
我希望将来通过主设置屏幕进行验证,并通过在子程序/方法中隐藏“辛勤工作”来简化应用程序编码。
我可能变得太聪明了,但我为每个'设置'创建了一个类,其中包含屏幕提示,默认值等,并使用Enum交叉引用它(因此编译器会突出显示错别字等)
我遇到的问题是,当我向NSMutableDictionary添加条目并使用lldb打印值时;每个条目似乎都有相同的“关键”和值。我已经尝试将eNum转换为NSNumber并且也作为NSString - 结果没有区别 - 所以我显然做了别的蠢事但是看不到它
以下代码来自各种.m& .h文件,我省略了你总是“必须要”保持简短的无聊的东西
// basic x-ref I want to use in my code
typedef NS_OPTIONS(NSInteger, ConfigurationType) {
unDefined = -1,
Server = 0,
Id = 1,
Phone = 2
};
// definition for a "single" Settings value
@interface SettingDefinition : NSObject
@end
@implementation SettingDefinition
ConfigurationType _cfgType;
NSString *_cfgName;
NSString *_screenTitle;
NSString *_value;
- (NSString *)description
{
NSString *className = NSStringFromClass([self class]);
return [NSString stringWithFormat:@"<%@: x%p Type=%d dbKey=%@ '%@' -> %@>", className, self, _cfgType, _cfgName, _screenTitle, _value];
}
- (id)initType:(ConfigurationType)cfgOption
withDbKey: (NSString*)dbKey
asOptionTitle:(NSString*)cfgTitle
withValue:(NSString*)itmValue
{
self = [super init];
if (self) {
_screenTitle = cfgTitle;
_cfgName = dbKey;
_cfgType = cfgOption;
_value = itmValue;
}
return self;
}
@end
@interface Configuration : NSObject
@end
@implementation Configuration {
NSMutableDictionary *Settings; // List of Setting structures
};
- (id)init {
self = [super init];
if (self) {
Settings = [[NSMutableDictionary alloc]init];
[self add:Server withDbKey:@"Server" asOptionTitle:@"Server"];
[self add:Id withDbKey:@"Id" asOptionTitle:@"Your ID"];
[self add:Phone withDbKey:@"Phone" asOptionTitle:@"Phone No."];
}
return self;
}
- (void) add:(ConfigurationType)cfgOption
withDbKey:(NSString*)dbKey
asOptionTitle:(NSString*)cfgTitle
{
NSString * itmValue = [self configurationValue: cfgOption cfgName:dbKey];
SettingDefinition *x = [[SettingDefinition alloc]
initType: cfgOption
withDbKey: dbKey
asOptionTitle: cfgTitle
withValue: itmValue];
[Settings setObject:x forKey:[self asKey:cfgOption]];
}
- (NSString *) asKey:(ConfigurationType) settingType {
NSString *rc = [NSString stringWithFormat:@"%d", settingType];
return rc;
}
- (NSString *) configurationValue:(ConfigurationType) settingType {
// returns a suitable value from my system setup
// which is initially a null value until the user sets everything up
}
调试窗口在最后一次调用[self add:...]
后中断时显示以下内容 (lldb) po Settings
{
0 = "<SettingDefinition: x0x8e7c280 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
1 = "<SettingDefinition: x0x8c703a0 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
2 = "<SettingDefinition: x0x8e7c310 Type=2 dbKey=Phone 'Phone No.' -> (null)>";
}
(null)显然是因为'value'中没有数据;但为什么他们都表现为'电话';如果我在第二次调用[self add:..]后休息,他们都显示为'Id'
更新:
DOH!显然它们是全局的(我一直在使用另一个IDE,其中所有东西都是本地的,直到暴露)。如果我在实现中将它们括在括号中作为文档陈述,那么展出的问题就会消失。我有访问变量的属性,但由于setter不仅仅是设置内存,我以为我需要我自己的“变量”来保存数据..说这是愚蠢的东西..谢谢!