2

Objective-C では、文字列の配列を作成するためのよりクリーンな方法を探しています。

配列にデータを入力したいのですが、最も簡単な解決策は次のようにハードコーディングすることです

NSArray *arr =  [[NSArray alloc] initWithObjects:@"First",@"Second",@"Third",nil];

私ができる UIPicker には、この配列のオブジェクト (文字列) を使用しています。ここで、ユーザーがピッカーからオプション (First/Second/Third) を選択すると、それぞれに対応する値が必要になります。

html のように<option value="1">First</option>、名前と値のペア間の直接的な対応を非常に明確にするものがあります。

したがって、1 つのオプションは別の配列を作成し、ユーザーがピッカーで項目を選択すると、対応する位置から 2 番目の配列から値を取得して使用することです。

どうやってそれを行うのか、それとももっと良い方法があるのか​​ 疑問に思っています。そのような静的データをxml(または何か)に入れ、そこから簡単に読み取れるようにして、コードが混乱しないようにした方がよいでしょうか?

4

7 に答える 7

4

並列にアクセスされる複数の配列を持つことは、通常は悪い考えです。簡単な代替方法は、各辞書が名前キーと値キーを持つ辞書の配列を 1 つ持つことです。より複雑になる場合は、辞書の代わりにカスタム オブジェクトを作成し、それらの配列を持つことができます。

于 2012-11-26T15:35:00.713 に答える
3

NSDictionaryを使用でき、構文により次のように簡単に宣言できます。

NSDictionary* dict= @{ @"First" : @1  , @"Second" : @2 , @"Third" : @3 };
于 2012-11-26T15:38:48.650 に答える
2

最善の方法は、NSDictionary を使用することです (内容が変更される場合は NSMutableDictionary かもしれません)。キーを文字列値にし、値を任意の値にします。このようなもの:

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:firstValue, "firstString", secondValue, "secondString", etc, "etc...", nil];
于 2012-11-26T15:35:27.310 に答える
1

を使用しているUIPickerView場合は、あなたが持っているように配列を定義するか、配列リテラル構文を使用します。

NSArray *array = @[@"First", @"Second", @"Third"];

ユーザーが何を選択したかを確認するときは、おそらくUIPickerView、ゼロベースのインデックスを返すメソッドselectedRowInComponentを取得しているだけです。必要に応じて、これを使用してインデックス内の文字列を検索できます。

NSInteger index = [self.pickerView selectedRowInComponent:0];
NSString *selectedString = array[index];

逆引き参照を実行する場合はindexOfObject、を使用できます。これにより、ゼロベースのインデックスが取得されます。

NSInteger index = [array indexOfObject:@"Third"];
NSLog(@"%d", index);

しかし、私は個人的に、テーブルビュー、ピッカービューなどに配列を使用しています。

于 2012-11-26T17:44:26.957 に答える
0

配列を作成する簡単な方法を次に示します。

NSString* string = @"first/second/third/fourth";
NSArray* arr = [[string componentsSeparatedByString:@"/"] retain];

しかし、あなたの質問によりよく答えるために、単純な NSPredicate を使用して値を抽出することで簡単にフィルター処理できるため、辞書の配列を使用します。これが例です。最初に、文字列/値のペアごとに辞書を作成し、それらを配列に入れることにより、辞書の配列を作成します...

NSDictionary* d1 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"first", [NSNumber numberWithInteger:1], nil] forKeys:[NSArray arrayWithObjects:@"string", @"value", nil]];
NSDictionary* d2 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"second", [NSNumber numberWithInteger:2], nil] forKeys:[NSArray arrayWithObjects:@"string", @"value", nil]];
NSDictionary* d3 = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"third", [NSNumber numberWithInteger:3], nil] forKeys:[NSArray arrayWithObjects:@"string", @"value", nil]];
NSArray* stringsAndValues = [[NSArray alloc] initWithObjects:d1, d2, d3, nil];

UIPicker のある時点で、文字列値が返されます。NSPredicate で値を簡単に取得する方法を次に示します。この場合、「2番目」が選択されたと仮定します...

NSString* stringValue = @"second";
NSPredicate* thePred = [NSPredicate predicateWithFormat:@"string == %@", stringValue];
NSArray* a = [stringsAndValues filteredArrayUsingPredicate:thePred];
NSInteger value = [[[a objectAtIndex:0] valueForKey:@"value"] integerValue];
于 2012-11-26T15:42:21.053 に答える
0

辞書の配列を含む plist ファイルを作成します。

<plist version="1.0">
<array>
    <dict>
        <key>title</key>
        <string>first</string>
        <key>value</key>
        <string>first_value</string>
    </dict>
    <dict>
        <key>title</key>
        <string>second</string>
        <key>value</key>
        <string>second_value</string>
    </dict>
</array>
</plist>

それをロードします:

NSString *filename = @"pickerData.plist";
NSString *pathToFile = [[NSBundle mainBundle].bundlePath stringByAppendingPathComponent:filename];
self.items = [NSArray arrayWithContentsOfFile:pathToFile];

次に、ピッカーを使用してデータを簡単に使用できます。

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 1;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return [self.items count];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [[self.items objectAtIndex:row] objectForKey:@"title"];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    [self doSomethingWithValue:[[self.items objectAtIndex:row] objectForKey:@"value"]];
}
于 2012-11-26T16:45:03.907 に答える
0

まさにアトゥル、よくわかりました。

XML ファイルを探して解析すると、処理が簡単になります。

編集:

解析された xml コンテンツは、アクセスしやすいようにディクショナリに格納できます。

于 2012-11-26T15:35:10.273 に答える