2008-10-18 11 views
38

Chciałbym pokazać zestaw kolejnych liczb w składniku UIPickerView, ale powinien on owijać się jak składnik sekundowy aplikacji Zegar-> Timer. Jedyne zachowanie, jakie mogę włączyć, wygląda jak komponent godziny w aplikacji Timer, w którym można przewijać tylko w jednym kierunku.Jak utworzyć zawijanie komponentu UIPickerView?

Odpowiedz

44

Równie łatwo jest ustawić liczbę wierszy na dużą liczbę i zacząć od wysokiej wartości, istnieje małe prawdopodobieństwo, że użytkownik kiedykolwiek przewinie koła przez bardzo długi czas - A nawet wtedy, Najgorsze, co się stanie, to to, że trafią na dno.

- (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

To działało dla mnie dobrze! Dzięki. Czy są jednak jakieś problemy z wydajnością/pamięcią? – Dimitris

+0

Nie powinno być żadnych problemów związanych z wydajnością/pamięcią w porównaniu z listą bez zawijania, ponieważ struktura nie zatrzymuje przewijanych elementów w pamięci. W razie wątpliwości użyj profilera! – squelart

+1

W ten sposób aplikacja Clock implementuje 'looping'.NSIntegerMax –

20

znalazłem moją odpowiedź tutaj:

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

Kiedy pyta o tytuł z rzędu, dać go: Kod:

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

Kiedy mówi didSelectRow użytkownik: inComponent :, użyj czegoś takiego:

Kod:

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

Wygląda na to, że UIPickerView nie obsługuje owijania wokół natywnie, ale można oszukać go, wstawiając więcej zestawów danych do wyświetlenia i po zatrzymaniu selektora, ustawiając środek na środku zbioru danych.

+0

niesamowite! dzięki za tonę !! dobre rozwiązanie było naprawdę pomocne – user1046037

0

Po prostu utwórz tablicę kilka razy, aby mieć wiele numerów. Powiedzmy, kiedy chcemy mieć liczby od 0 do 23 i umieścić je w tablicy. że będziemy robić 10 razy tak ...

NSString *stdStepper; 

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

      [_hoursArray addObject:stdStepper]; 

     } 
    } 

później ustawić wybrany wiersz 0 jak to

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

Wszystkie odpowiedzi nie są tak naprawdę czyni widok kompletacji zwój cyklicznie.

Zrobiłem cykliczny tableView na podstawie UIScrollView. I na podstawie tego tableView, ponownie implementuję UIPickerView. Możesz być zainteresowany tym DLPickerView. Ten widok selektora ma wszystkie funkcje, które ma UIPickerView, ale daje również wiele nowych funkcji, a niestandardowy widok tego sortowania jest znacznie łatwiejszy.

https://github.com/danleechina/DLPickerView

i mieć świadomość, że ten DLPickerView cyklicznie przewijania jest naprawdę przewijanie cyklicznie. Cała magia powstała z powodu innej klasy DLTableView.