我有一个iOS应用,可将传入的文本字段与用于导入记录的标准字段进行匹配。我的问题是使用这些字段的NSMutableDictionary是空的!以下是保存映射的代码:
-(void)mapUserFields: (id) sender { // move contents of each textField when user has finished entering it
SingletonDictionary *sd = [SingletonDictionary sharedDictionary];
UITextField *tf = (UITextField *)sender; // textfield contains the pointer to user's half of the equation
int tagValue = (int)tf.tag; // get the tag value
[sd.dictionaryOfUserIndexes setObject:tf.text forKey:[NSString stringWithFormat:@"%d", tagValue]]; // value found in textField id'd by tag
NSLog(@"\nfield.text: %@ tagValue: %d nsd.count: %d\n",tf.text, tagValue, sd.dictionaryOfUserIndexes.count);
}
这是NSLog的结果:
field.text:1 tagValue:38 nsd.count:0
这是.h文件中单例的定义:
@property (nonatomic, retain) NSMutableDictionary *dictionaryOfUserIndexes;
这是初始化.m文件中单例的代码:
//-- SingletonDictionaryOfUserIDs --
+ (id) sharedDictionary {
static dispatch_once_t dispatchOncePredicate = 0;
__strong static id _sharedObject = nil;
dispatch_once(&dispatchOncePredicate, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
-(id) init {
self = [super init];
if (self) {
dictionaryOfUserIndexes = [NSMutableDictionary new];
}
return self;
}
@end
我认为我的问题是因为 sd.dictionaryOfUserIndexes 未初始化,但我不确定这是否属实,如果是,则如何初始化(我尝试了几种不同的变体,所有这些都会产生构建错误)。我查看了SO和Google,但没有发现解决这个问题的任何问题。非常感谢帮助!
答案 0 :(得分:1)
我们可以在这段代码中改进一些内容,但唯一错误的内容是dictionaryOfUserIndexes
方法中对init
的引用。发布的代码不会编译,除非:(a)你有一行代码:
@synthesize dictionaryOfUserIndexes = dictionaryOfUserIndexes;
以便在没有默认_
前缀的情况下命名支持变量,或者(b)使用默认前缀引用ivar,如:
_dictionaryOfUserIndexes = [NSMutableDictionary new];
另一种方式 - 除了在init方法中以外的大多数情况下都是优选的 - 是使用合成的setter,如:
self.dictionaryOfUserIndexes = [NSMutableDictionary new];
但是单独使用该更改(因此它将编译)您的代码运行正常,向字典添加值并记录增量计数。