2009-08-18 2 views
1

Kann mir jemand helfen, wie der UIPickerView den Wert der ersten Zeile nach dem Wert der letzten Zeile anzeigt, genau wie der UIDatePicker, wo nach 12 die 1 folgen wird.UIPickerView: letzter Wert gefolgt von erstem Wert

Dank

+0

Sie möchten es kreisförmig machen? Ich versuche eine Antwort zu finden, schau später zurück, vielleicht habe ich es herausgefunden. – mk12

+0

Siehe http://stackoverflow.com/questions/214441/how-do-you-make-an-uipickerview-component-wrap-around – squelart

Antwort

5

Ich glaube nicht, seine mögliche wirklich kreisförmig machen, aber man kann es fälschen.

#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]]; 
} 

Sie können die Anzahl der Zeichenfolgen in PickerData ändern, und es funktioniert immer noch gut. Die ausgewählte Zeile wählt den "ersten" Wert aus, der der Mitte am nächsten liegt. row% [pickerData count] liefert die folgende Annahme, es gibt 3 NSStrings in pickerData:

 
ROW    RETURNS 
0    0 
1    1 
2    2 
3    0 
4    1 
5    2 
6    0 
7    1 
8    2 
etc...
Es wird nur 0 durch die Länge des Arrays durchlaufen. Das verwirrende Zeugs in viewDidLoad wählt einen Wert so nah wie möglich an der Mitte aus, indem er den Index des Elements des von Ihnen angegebenen Arrays in selectedItem verwendet. Es gibt keinen Leistungseinbruch oder Speicherverlust, alles, was Sie zugewiesen haben, ist das einzelne Array. Wann immer Sie auf ihre ausgewählte Auswahl zugreifen, verwenden Sie ([localPicker selectedRowInComponent: 0]% [pickerData count]). Wenn es etwas gibt, was du nicht verstehst oder etwas, das ich vermisst habe, bitte komment. Hoffe das half!

+0

Danke für die Antwort. Aber wird es 1000000 Zeilen erstellen, und wenn ich UIImages zu dieser Zeile hinzufügen wird es Speicher/Leistung Problem erstellen. – edie

+1

Nur die Zeilen, die sichtbar sind, werden geladen, und die Zellen/Zeilen/wie auch immer sie für UIPickerViews heißen, sollten, glaube ich, wiederverwendet werden. –

+0

Ja, es wird kein Speicher-/Leistungsproblem geben. – mk12

0

Ich habe eine zyklische TableView basierend auf UIScrollView gemacht. Und basierend auf diesem TableView implementiere ich UIPickerView neu. Das könnte Sie interessieren DLPickerView. Und diese Picker-Ansicht hat alle Funktionen, die UIPickerView hat, bietet aber auch viele neue Funktionen, und benutzerdefiniert ist diese Picker-Ansicht viel einfacher.

https://github.com/danleechina/DLPickerView

Und sich bewusst sein, dass diese DLPickerView zyklisch scroll wirklich zyklisch Scrollen. All die Magie geschah wegen einer anderen Klasse DLTableView.