pickerview example ios swift ios8 uipickerview

ios - example - UIPickerView-Bucle de datos



uipickerview swift 4 example (2)

Habrá cuatro pasos aquí: configuraremos algunas constantes para mantener los datos de la vista del selector y un poco de configuración, luego UIPickerViewDelegate métodos UIPickerViewDataSource y UIPickerViewDelegate , y finalizaremos con la inicialización de viewDidLoad .

Primero, la configuración:

private let pickerViewData = Array(0...59) // contents will be 0, 1, 2, 3...59, change to whatever you want private let pickerViewRows = 10_000 // any big number private let pickerViewMiddle = ((pickerViewRows / pickerViewData.count) / 2) * pickerViewData.count

Tenga en cuenta la constante pickerViewMiddle : está calculada para que sea muy fácil obtener nuestro valor actual del desplazamiento de fila. En la fuente de datos, solo necesitamos proporcionar un título para cada fila, pero agregaremos un método de ayuda para convertir un número de fila a un valor de la matriz:

extension ViewController : UIPickerViewDataSource { func valueForRow(row: Int) -> Int { // the rows repeat every `pickerViewData.count` items return pickerViewData[row % pickerViewData.count] } func rowForValue(value: Int) -> Int? { if let valueIndex = find(pickerViewData, value) { return pickerViewMiddle + value } return nil } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { return "/(valueForRow(row))" } }

Y finalmente configuraremos el delegado:

extension ViewController : UIPickerViewDelegate { func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerViewRows } // whenever the picker view comes to rest, we''ll jump back to // the row with the current value that is closest to the middle func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { let newRow = pickerViewMiddle + (row % pickerViewData.count) pickerView.selectRow(newRow, inComponent: 0, animated: false) println("Resetting row to /(newRow)") } }

Para inicializar, en su viewDidLoad configure el delegado y la fuente de datos y luego muévase a la fila correcta en el medio de su selector:

self.picker.delegate = self self.picker.dataSource = self let initialValue = 0 if let row = rowForValue(initialValue) { self.picker.selectRow(row, inComponent: 0, animated: false) } // or if you just want to start in the middle: // self.picker.selectRow(pickerViewMiddle, inComponent: 0, animated: false)

Actualmente estoy desarrollando una aplicación que usa Swift donde uso un UIPickerView, vea debajo la imagen. Actualmente UIPickerView se detiene cuando el usuario se desplazó a los últimos datos, pero quiero que nunca se detenga. Quiero que sea posible comenzar desde la primera información simplemente siga desplazándose cuando esté en la parte inferior. O desplácese hacia arriba cuando esté en la parte superior. Quiero que sea como la cuenta regresiva de Apple, donde puedes arrastrar hacia arriba o hacia abajo cuando quieras.

Cómo quiero que sea:

Cómo es actualmente:


Esto ya se ha respondido aquí: ¿cómo se hace que un componente UIPickerView se ajuste?

La idea básica es que simplemente cree una vista del selector con un número suficientemente grande de filas repetitivas que el usuario probablemente nunca llegue al final. En la respuesta anterior hay un problema con la forma en que se crea el número de filas, por lo que he editado esa pieza y proporcioné la respuesta restante a continuación. Esto es objetivo c, por lo que deberá convertirlo rápidamente para sus propósitos ...

@implementation ViewController NSInteger numberItems; NSInteger currentValue; - (void)viewDidLoad { [super viewDidLoad]; self.pickerView.delegate = self; numberItems = 60; currentValue = 0; [self.pickerView selectRow:(currentValue + (numberItems * 50)) inComponent:0 animated:NO]; [self.view addSubview:self.pickerView]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { //return NSIntegerMax; -- this does not work on 64-bit CPUs, pick an arbitrary value that the user will realistically never scroll to like this... return numberItems * 100; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { return [NSString stringWithFormat:@"%ld", row % numberItems]; } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { NSInteger rowValueSelected = row % numberItems; NSLog(@"row value selected: %ld", (long)rowValueSelected); } @end