2009-08-18 9 views
1

UIPickerViewが最後の行の値の後に最初の行の値を表示する方法を教えてもらえますか?12の後に続くUIDatePickerと同じです。UIPickerView:最初の値が続く最後の値

おかげ

+0

あなたはそれを円形にしたいですか?私は答えを見つけようとしています、後で私はそれを考え出したかもしれません。 – mk12

+0

http://stackoverflow.com/questions/214441/how-do-you-make-an-uipickerview-component-wrap-aroundを参照してください – squelart

答えて

5

私は実際にそれが円形作るためにその可能性はないと思うが、あなたは偽物それことができます。

#define kRowsInPicker 10000 

- (void)viewDidLoad { 
    NSArray *localPickerData = [[NSArray alloc] initWithObjects: 
           @"Ottawa", @"Toronto", @"Montreal", @"Winnipeg", 
           @"Saskatchewan", @"Iqaluit", @"Edomonton", nil]; 
    [self setPickerData:localPickerData]; 
    [localPickerData release]; 

    UIPickerView *localPicker = [[UIPickerView alloc] initWithFrame: 
           CGRectMake(0, 0, 320, 216)]; 
    [localPicker setDelegate:self]; 
    [localPicker setDataSource:self]; 
    localPicker.showsSelectionIndicator = YES; 
    NSInteger selectedRow = 0; 
    [localPicker selectRow:(((NSInteger)((kRowsInPicker/2)/[pickerData count])) * [pickerData count]) + (selectedRow%[pickerData count]) inComponent:0 animated:NO]; 
    [self setPicker:localPicker]; 
    [localPicker release]; 

    [[self view] addSubview:picker]; 
    [super viewDidLoad]; 
} 
#pragma mark - 
#pragma mark UIPickerViewDataSource methods 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 1; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView 
           numberOfRowsInComponent:(NSInteger)component { 
    // usually "return [pickerData count];" 
    return kRowsInPicker; // 10,000 is good, if you add a few more zeros 
          // there seems to be problems. 
} 

#pragma mark - 
#pragma mark UIPickerViewDelegate methods 

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

pickerDataの文字列の数を変更することはできますが、それでも問題はありません。選択された行は、中央に最も近い「最初の」値を選択します。行%[pickerData count]は、pickerDataに3つのNSStringがあると仮定して、次のように返します。

 
ROW    RETURNS 
0    0 
1    1 
2    2 
3    0 
4    1 
5    2 
6    0 
7    1 
8    2 
etc...
配列の長さの0だけ循環します。 viewDidLoadの混乱しているものは、 selectedItemで指定した配列の項目のインデックスを使用して、できるだけ真ん中に近い値を選択するだけです。パフォーマンスヒットやメモリリークはなく、割り当てられたのは単一の配列だけです。選択した選択肢にアクセスするたびに、([localPicker selectedRowInComponent:0]%[pickerData count])を使用します。あなたが理解できないことや忘れたことがある場合は、コメントしてください。 これが助けてくれることを願っています!

+0

応答いただきありがとうございます。しかし、1000000行が作成されますが、この行にUIImagesを追加すると、メモリ/パフォーマンスの問題が発生します。 – edie

+1

表示されている行だけがロードされ、UIPickerViewsのために呼び出されたセル/行/何でも再利用されるはずです。 –

+0

はい、メモリ/パフォーマンスの問題は発生しません。 – mk12

0

私はUIScrollViewに基づいて周期的なテーブルビューを作成しました。そして、このtableViewに基づいて、UIPickerViewを再実装します。これに興味があるかもしれませんDLPickerViewこのピッカービューにはUIPickerViewのすべての機能が含まれていますが、多くの新機能も提供されています。カスタムのピッカービューははるかに簡単です。

https://github.com/danleechina/DLPickerView

そしてこのDLPickerView周期的にスクロールが実際に周期的にスクロールされていることに注意してください。すべての魔法は別のクラスDLTableViewのために起こった。

関連する問題