从NSDictionaries获取值

时间:2013-02-06 23:32:47

标签: ios error-handling uiimageview nsdictionary

我有以下代码:

NSDictionary *dict = @[@{@"Country" : @"Afghanistan", @"Capital" : @"Kabul"},
                     @{@"Country" : @"Albania", @"Capital" : @"Tirana"}];

我想列出许多国家和首都,然后随机化,即一个国家并将其放在屏幕上,然后用户应该能够选择正确的资本..

  1. 如何把国家?像dict.Country[0]或类似的东西?

  2. 代码有什么问题?我收到错误 "Initializer element is not a compile-time constant" and the warning "Incompatible pointer types initializing 'NSDictionary *_strong' with an expression of type 'NSArray *'.

  3. 我可以在Dictionary中创建第三个字符串,包含一个标志文件..例如

    @“Flagfile”:@“Albania.png”

  4. 然后把它放在图像视图中?

    我想要一个带有随机数I(例如)的循环并且像(我知道这不对,但我希望你明白这一点)

    loop..
    ....
    
    text= dict.Country[I]; 
    
    button.text= dict.Capital[I];
    
    Imageview=dict.Flagfile[I];
    .....
    ....
    

3 个答案:

答案 0 :(得分:2)

你的顶级元素是两个NSDictionary的NSArray(@ [],带方括号,构成一个数组)。要访问其中一个词典中的属性,您可以执行array [index] [key],例如array [0] [@“Country”]会给你@“阿富汗”。如果您使用NSArray * array = ...而不是NSDictionary * dict = ...

如果你想随机选择一个国家,你可以获得一个随机数,得到它的mod 2(someInteger%2)并将其用作你的索引,例如: array [randomNumber%2] [@“Country”]将从您的词典数组中为您提供一个随机的国家/地区名称。

如果您在图片库中存储图像名称,则可以使用UIImage的+imageNamed:方法加载该图像的图像。

答案 1 :(得分:2)

这是关于mbuc91正确想法的更完整的说明。

1)创建国家

// Country.h

@interface Country : NSObject

@property(strong,nonatomic) NSString *name;
@property(strong,nonatomic) NSString *capital;
@property(strong,nonatomic) NSString *flagUrl;
@property(strong,nonatomic) UIImage *flag;

// this is the only interesting part of this class, so try it out...
// asynchronously fetch the flag from a web url.  the url must point to an image
- (void)flagWithCompletion:(void (^)(UIImage *))completion;

@end

// Country.m

#import "Country.h"

@implementation Country

- (id)initWithName:(NSString *)name capital:(NSString *)capital flagUrl:(NSString *)flagUrl {

    self = [self init];
    if (self) {
        _name = name;
        _capital = capital;
        _flagUrl = flagUrl;
    }
    return self;
}

- (void)flagWithCompletion:(void (^)(UIImage *))completion {

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.flagUrl]];
    [NSURLConnection sendAsynchronousRequest:request
                                       queue:[NSOperationQueue mainQueue]
                           completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                               if (data) {
                                   UIImage *image = [UIImage imageWithData:data];
                                   completion(image);
                               } else {
                                   completion(nil);
                               }
                           }];
}

@end

2)现在,在其他一些课程中,使用国家

#import "Country.h"

- (NSArray *)countries {

    NSMutableArray *answer = [NSMutableArray array];

    [answer addObject:[[Country alloc]
                       initWithName:@"Afghanistan" capital:@"Kabul" flagUrl:@"http://www.flags.com/afgan.jpg"]];

    [answer addObject:[[Country alloc]
                       initWithName:@"Albania" capital:@"Tirana" flagUrl:@"http://www.flags.com/albania.jpg"]];

    return [NSArray arrayWithArray:answer];
}

- (id)randomElementIn:(NSArray *)array {

    NSUInteger index = arc4random() % array.count;
    return [array objectAtIndex:index];
}

-(void)someMethod {

    NSArray *countries = [self countries];
    Country *randomCountry = [self randomElementIn:countries];
    [randomCountry flagWithCompletion:^(UIImage *flagImage) {
        // update UI, like this ...
        // self.flagImageView.image = flagImage;
    }];
}

答案 2 :(得分:1)

您无法以这种方式初始化NSDictionary。 NSDictionary是一个未排序的键对象集 - 它的顺序不是静态的,所以你不能像对待数组一样对它进行处理。在您的情况下,您可能需要NSMutableDictionary,因为您将修改其内容(有关详细信息,请参阅Apple的NSMutableDictionary Class Reference)。

您可以通过几种方式实现代码。使用NSDictionaries,您将执行类似于以下操作:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]
    initWithObjectsAndKeys:@"Afghanistan", @"Country",
    @"Kabul", @"Capital", nil];

然后你会有一个字典数组,每个字典都包含一个国家的详细信息。

另一个选择是为每个国家/地区创建一个简单的模型类,并有一个数组。例如,您可以创建一个名为Country的类,其中Country.h为:

#import <Foundation/Foundation.h>
@interface Country : NSObject

@property (nonatomic, retain) NSString *Name;
@property (nonatomic, retain) NSString *Capital;
//etc...

@end