我有以下代码:
NSDictionary *dict = @[@{@"Country" : @"Afghanistan", @"Capital" : @"Kabul"},
@{@"Country" : @"Albania", @"Capital" : @"Tirana"}];
我想列出许多国家和首都,然后随机化,即一个国家并将其放在屏幕上,然后用户应该能够选择正确的资本..
如何把国家?像dict.Country[0]
或类似的东西?
代码有什么问题?我收到错误 "Initializer element is not a compile-time constant" and the warning "Incompatible pointer types initializing 'NSDictionary *_strong' with an expression of type 'NSArray *'.
我可以在Dictionary中创建第三个字符串,包含一个标志文件..例如
@“Flagfile”:@“Albania.png”
然后把它放在图像视图中?
我想要一个带有随机数I(例如)的循环并且像(我知道这不对,但我希望你明白这一点)
loop..
....
text= dict.Country[I];
button.text= dict.Capital[I];
Imageview=dict.Flagfile[I];
.....
....
答案 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