2008-10-18 5 views
38

Ich möchte eine Reihe von fortlaufenden Nummern in einer UIPickerView-Komponente zeigen, aber es wie die Sekunden-Komponente der Clock-> Timer-Anwendung umbrechen lassen. Das einzige Verhalten, das ich aktivieren kann, sieht aus wie die Stunden-Komponente der Timer-Anwendung, in der Sie nur in eine Richtung blättern können.Wie lässt sich eine UIPickerView-Komponente umbrechen?

Antwort

44

Es ist genauso einfach, die Anzahl der Zeilen auf eine große Anzahl zu setzen und sie mit einem hohen Wert beginnen zu lassen. Es besteht kaum eine Chance, dass der Benutzer sehr lange das Rad durchläuft - Und selbst dann desto schlimmer wird es sein, dass sie den Boden erreichen werden.

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    // Near-infinite number of rows. 
    return NSIntegerMax; 
} 

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    // Row n is same as row (n modulo numberItems). 
    return [NSString stringWithFormat:@"%d", row % numberItems]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.pickerView = [[[UIPickerView alloc] initWithFrame:CGRectZero] autorelease]; 
    // ...set pickerView properties... Look at Apple's UICatalog sample code for a good example. 
    // Set current row to a large value (adjusted to current value if needed). 
    [pickerView selectRow:currentValue+100000 inComponent:0 animated:NO]; 
    [self.view addSubview:pickerView]; 
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    NSInteger actualRow = row % numberItems; 
    // ... 
} 
+0

Das hat für mich gut funktioniert! Vielen Dank. Gibt es irgendwelche Leistungs-/Speicherprobleme? – Dimitris

+0

Es sollte keine Performance-/Speicherprobleme im Vergleich zu einer Non-Wrapping-Liste geben, da das Framework die gescrollten Elemente nicht im Speicher hält. Wenn Sie sich nicht sicher sind, verwenden Sie den Profiler! – squelart

+1

So implementiert die Uhr-App 'looping'.NSIntegerMax –

20

ich meine Antwort hier:

http://forums.macrumors.com/showthread.php?p=6120638&highlight=UIPickerView#post6120638

Wenn es um den Titel einer Reihe fragt, geben Sie ihm: Code:

return [rows objectAtIndex:(row % [rows count])]; 

Wenn es sagt der Benutzer didSelectRow: inComponent Verwenden Sie etwa Folgendes:

Code:

//we want the selection to always be in the SECOND set (so that it looks like it has stuff before and after) 
if (row < [rows count] || row >= (2 * [rows count])) { 
    row = row % [rows count]; 
    row += [rows count]; 
    [pickerView selectRow:row inComponent:component animated:NO]; 
} 

Es scheint, dass UIPickerView das native Wrapping nicht unterstützt, aber Sie können es täuschen, indem Sie weitere Datensätze einfügen, die angezeigt werden sollen, und wenn die Auswahl aufhört, zentriert die Komponente in der Mitte des Datensatzes.

+0

genial !! Danke vielmals !! gute Lösung war wirklich hilfreich – user1046037

0

Erstellen Sie einfach ein Array mehrmals, so dass Sie Ihre Nummern mehrmals haben. Sagen wir mal, wenn wir die Zahlen von 0 bis 23 haben wollen und setzen das in ein Array. dass wir 10-mal so machen ...

NSString *stdStepper; 

    for (int j = 0; j<10; j++) { 
     for(int i=0; i<24; i++) 
     { 
      stdStepper = [NSString stringWithFormat:@"%d", i]; 

      [_hoursArray addObject:stdStepper]; 

     } 
    } 

später haben wir alle die Zeile 0 ausgewählt ähnliche

[_hoursPickerView selectRow:120 inComponent:0 animated:NO]; 
0

die Antworten sind nicht wirklich machen Picker Ansicht blättern zyklisch eingestellt.

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.