NSMutableDictionaryを含むシングルトンがあります。ビューの1つからその辞書にエントリを追加したいと思います。それが機能していないことを理解できない理由で、「NSDictionary setObject:forKey:unrecognizedセレクターがインスタンスに送信されました」というエラーが表示されます。これはそれほど難しいことではないようですが、問題の答えを見つけることができません。
そこで、.xibにボタンを接続して、createKeyメソッドとkablooeyを呼び出しました。また、辞書が存在することを確認するためにテストしました。
これが私のシングルトンヘッダーです:
#import <Foundation/Foundation.h>
@interface SharedAppData : NSObject <NSCoding>
{
NSMutableDictionary *apiKeyDictionary;
}
+ (SharedAppData *)sharedStore;
@property (nonatomic, copy) NSMutableDictionary *apiKeyDictionary;
-(BOOL)saveChanges;
@end
私のシングルトン実装(重要なビット)
@interface SharedAppData()
@end
@implementation SharedAppData
@synthesize apiKeyDictionary;
static SharedAppData *sharedStore = nil;
+(SharedAppData*)sharedStore {
@synchronized(self){
if(sharedStore == nil){
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *testFile = [documentsDirectory stringByAppendingPathComponent:@"testfile.sav"];
Boolean fileExists = [[NSFileManager defaultManager] fileExistsAtPath:testFile];
if(fileExists) {
sharedStore = [NSKeyedUnarchiver unarchiveObjectWithFile:testFile];
}
else{
sharedStore = [[super allocWithZone:NULL] init];
}
[sharedStore setSaveFile:testFile];
}
return sharedStore;
}
}
- (id)init {
if (self = [super init]) {
apiKeyDictionary = [[NSMutableDictionary alloc] init];
}
return self;
}
私のビューコントローラヘッダーでは...
#import <UIKit/UIKit.h>
#import "SharedAppData.h"
@interface AddKeyViewController : UIViewController <UITextFieldDelegate>
{
UIButton *addKey;
}
@property (weak, nonatomic) IBOutlet UITextField *apiName;
@property (weak, nonatomic) IBOutlet UITextField *apiKey;
-(IBAction)createKey:(id)sender;
@end
ビューコントローラーの実装:
#import "AddKeyViewController.h"
#import "SharedAppData.h"
@interface AddKeyViewController ()
@end
@implementation AddKeyViewController
@synthesize apiName, apiKey, toolbar;
-(IBAction)createKey:(id)sender {
NSString *name = [apiName text];
NSString *key = [apiKey text];
[[[SharedAppData sharedStore] apiKeyDictionary] setObject:key forKey:name];
}
@end