0

我有以下代码:

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. 我可以在字典中创建第三个字符串,包含一个标志文件.. 例如

    @“标志文件”:@“阿尔巴尼亚.png”

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

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

loop..
....

text= dict.Country[I]; 

button.text= dict.Capital[I];

Imageview=dict.Flagfile[I];
.....
....
4

3 回答 3

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) 现在,在其他类中,使用 Country

#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;
    }];
}
于 2013-02-07T01:03:51.620 回答
2

您的顶级元素是两个 NSDictionary 的 NSArray(@[],带有方括号,组成一个数组)。要访问其中一个字典中的属性,您将执行 array[index][key],例如 array[0][@"Country"] 将给您@"Afghanistan"。如果你做了 NSArray *array = ... 而不是 NSDictionary *dict = ...

如果你想随机选择一个国家,你可以得到一个随机数,得到它 mod 2 (someInteger % 2) 并将它用作你的索引,例如 array[randomNumber % 2][@"Country"] 会给你一个从您的字典数组中随机国家名称。

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

于 2013-02-06T23:39:50.730 回答
1

您不能以这种方式初始化 NSDictionary。NSDictionary 是一组未排序的键-对象对 - 它的顺序不是静态的,因此您不能像处理数组一样处理它。在您的情况下,您可能需要一个 NSMutableDictionary,因为您将修改其内容(有关更多信息,请参阅 Apple 的NSMutableDictionary 类参考)。

您可以通过几种方式实现您的代码。使用 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
于 2013-02-06T23:49:45.883 回答