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. 辞書にフラグファイルを含む3番目の文字列を作成できますか?たとえば

    @ "Flagfile":@ "Albania.png"

後でそれを画像ビューに入れますか?

私は(たとえば)乱数を使ったループのようにしたいと思います(これは正しくないことはわかっていますが、要点を理解していただければ幸いです)

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)さて、他のクラスでは、国を使用します

#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

最上位の要素は、2つのNSDictionaryのNSArray(@ []、角かっこで囲まれ、配列を作成します)です。いずれかの辞書の属性にアクセスするには、array [index] [key]を実行します。たとえば、array [0][@"Country"]は@"Afghanistan"を提供します。NSDictionary * dict=..の代わりにNSArray*array=...を実行した場合

国をランダムに選択する場合は、乱数を取得し、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];

次に、辞書の配列が作成され、各辞書には1つの国の詳細が保持されます。

もう1つのオプションは、国ごとに単純なモデルクラスを作成し、それらの配列を作成することです。たとえば、次のように、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 に答える