2

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
4

2 に答える 2

2

問題は、あなたの財産が「強い」ではなく「コピー」であることにあると思います。これを設定すると、mutanledictionsryが不変のものにコピーされます。プロパティを「強い」に変更してみてください。

于 2012-09-28T02:45:55.000 に答える
2

プロパティapiKeyDictionaryはに設定されていcopyます。これにより、メソッドで作成したインスタンスにcopyメッセージが送信されます。ではなく、が返されます。または代わりに変更してください。NSMutableDictionaryinitNSMutableDictionaryNSDictionarystrongretain

于 2012-09-28T02:46:13.777 に答える