Domanda

Qualcuno mi può aiutare come fare l'UIPickerView visualizza il valore del primo fila dopo il valore dell'ultima fila, proprio come l'UIDatePicker dove dopo 12 il 1 seguirà.

Grazie

È stato utile?

Soluzione

Non credo che la sua possibile rendere davvero circolare, ma si può fingere.

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

È possibile modificare il numero di stringhe in pickerData e sarà ancora funzionare bene. La riga selezionata seleziona la "prima" valore più vicino al centro. riga% [count pickerData] restituisce i seguenti ci sono assumendo 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...
Sarà solo ciclo 0 attraverso la lunghezza della matrice. La roba confusa in viewDidLoad solo seleziona un valore più vicino possibile al centro possibile utilizzando l'indice della voce della matrice che fornisci in selectedItem . Non v'è alcun calo di prestazioni o di perdita di memoria, tutto quello che hai assegnato è il singolo array. Ogni volta che si accede la loro scelta selezionato, utilizzare ([localPicker selectedRowInComponent: 0]% [count pickerData]). Se c'è qualcosa che non capisci o qualcosa mi mancava, si prega di commento. Spero che questo ha aiutato!

Altri suggerimenti

Ho fatto un tableView ciclica basata su UIScrollView. E sulla base di questo tableView, ho re-implementare UIPickerView. Si potrebbe essere interessato a questo DLPickerView. E questo punto di vista raccoglitrice ha tutte le caratteristiche che ha UIPickerView, ma dà anche molte nuove caratteristiche, e questo punto di vista personalizzato selettore è molto più facile.

https://github.com/danleechina/DLPickerView

Ed essere consapevoli di che questo DLPickerView scorrimento ciclicamente è davvero scorre ciclicamente. Tutta la magia è accaduto a causa di un altro DLTableView classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top