nsmutabledictionary在类外部访问时返回null

时间:2013-11-21 08:41:57

标签: objective-c uiimage nsmutabledictionary

我搜索了一下,但没有找到我的问题的答案。我是Objective-c的初学者,我目前正在尝试使用词典。我有一个名为“SETestBank”的类,它创建3个图像字典,然后将它们添加到一个大字典中。我这样做是因为我可以添加更多更小的词典。我已经创建了一个特定的“accessBank”方法来通过其他类将对象拉出来。

SETestBank.m

#import "SETestBank.h"

@implementation SETestBank
@synthesize mathBankA, mathBankB, mathBankC, mathTest;

- (id)init
{
     [self createBankA];
     [self createBankB];
     [self createBankC];
     [self createTest];
     return 0;
 }

 - (NSMutableDictionary *)createBankA
 {
     mathBankA = [[NSMutableDictionary alloc] init];
     for (int i=0; i < 11; i++) {
         NSString *aKey = [NSString stringWithFormat:@"%da", i];
         NSString* imageName = [NSString stringWithFormat:@"%da.png",i];
         [mathBankA setObject:imageName forKey:aKey];
         NSLog(@"%@", aKey);
     }
     return mathBankA;
 }

 //same occurs to generate bankB and bankC

 - (NSMutableDictionary *)createTest
 {
     mathTest = [[NSMutableDictionary alloc] init];

     [mathTest addEntriesFromDictionary:mathBankA];
     [mathTest addEntriesFromDictionary:mathBankB];
     [mathTest addEntriesFromDictionary:mathBankC];

     return mathTest;
 }

 - (NSString *)accessBank:(NSString *)accessor
 {
     NSString *img = [mathTest objectForKey:accessor];

     return img;
 }

 @end

现在这段代码似乎运行正常。创建了词典,控制台日志显示正确的键和目标文件名(图像都在项目中并且正确命名)

但是,当我在视图控制器中访问它并尝试将图像应用到UIImageView时,我什么也得不到。

SEViewController:

- (void)viewDidLoad
{
    SETestBank *mathTest = [[SETestBank alloc] init];

    UIImage *img = [UIImage imageNamed:[mathTest accessBank:@"1a"]];
    NSString *test = [mathTest accessBank:@"1a"];
    NSLog(@"%@", test);
    [imageView setImage:img];
    [self.view addSubview:imageView];
    [super viewDidLoad];
}

此处的日志只返回null以及“CUICatalog:提供的资产名称无效:( null),或无效比例因子:1.000000”我收集的错误是尝试将null分配给图像。我很难过这个。如果我硬编码图像显示“1a.png”而不是试图通过键访问它,它工作正常,但这不是我想要完成的。 imageView连接到storyboard中的UIImageView,视图控制器设置为使用SEViewController作为它的类。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在init方法中,返回0,表示无(nil)

- (id)init
{
     [self createBankA];
     [self createBankB];
     [self createBankC];
     [self createTest];
     return 0;
}

将此更改为

- (id)init
{
    if (self = [super init]) {
      [self createBankA];
      [self createBankB];
      [self createBankC];
      [self createTest];
    }
    return self;
}

可能会解决您的问题。

答案 1 :(得分:0)

您在SETestBank中的init返回0,因此当您执行

时,您的mathTest对象为零
 SETestBank *mathTest = [[SETestBank alloc] init];