1

文字列の NSMutableArray をアルファベット順にソートし、ソートされたリストを UIPickerView に表示しようとしています。別の NSArray を使用してソート済みリストを作成しています。

私は PickerView Delegate Methods を使用しており、それらを .h セットアップに含めており、dataSource とデリゲート アウトレットを filesOwner に接続しています。私の .h ファイルでは、IBOutlet UIPickerView *pickerView; も作成しました。次のように合成プロパティを作成しました。

@property (nonatomic, retain) IBOutlet UIPickerView *pickerView;

問題のトラブルシューティングを試みて、まず次のようにして、ソートされていない NSMutableArray をソースにしました。

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

return [pickerArray objectAtIndex:row];
}

ソートされていない MutableArray には問題がなく、データ (ソートされていない) が PickerView に問題なく表示されますが、配列をソート済みの NSArray に変更すると、PickerView を移動しようとするとクラッシュします!? 両方の配列内の項目の NSLog は、同じ数の項目、同じデータ (明らかに異なって表示されます) を明らかにしますが、Xcode は EXC_BAD_ACCESS?? を報告します。これじゃ解らないよね??

ここに私のコードがあります: (注: sortedPickerArray は NSArray で、pickerArray は私の .h ファイルで宣言された NSMutableArray です)

- (void)viewDidLoad{

[super viewDidLoad];

sortedPickerArray = [[NSArray alloc] init];

pickerArray = [[NSMutableArray alloc] initWithObjects:
               @"ObjectA",
               @"ObjectB",
               @"ObjectC",
               @"ObjectD",
               nil];

sortedPickerArray = [pickerArray sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];
[pickerView selectRow:0 inComponent:0 animated:NO];
pickerView.showsSelectionIndicator = YES;}


-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView{

return 1;
}

-(NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component{

return [sortedPickerArray count];
}

-(NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
return [sortedPickerArray objectAtIndex:row];
}

-(void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{

NSLog(@"Row %d was selected", row);
}

これに関するヘルプは大歓迎です。

4

1 に答える 1

1

この回答では、プロパティが保持されているため、ARCを使用していないと想定しています。次のステートメントを使用して、自動解放された値をインスタンス変数に割り当てます。

sortedPickerArray = [pickerArray sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)];

後でアクセスするsortedPickerArrayと、すでに割り当てが解除されています。したがって、ARCを使用していないと仮定してretain、そこにを追加します。そして sortedPickerArray = [[NSArray alloc] init];、今のところこの配列をリークしているので、行を削除します。

于 2012-08-30T04:12:02.523 に答える