2009-09-07 19 views
20

Tengo un UIPickerView con 3 componentes llenos con 2 NSMutableArrays (2 componentes tienen la misma matriz).Obtener la fila seleccionada en UIPickerView para cada componente

Un tutorial dice:

//PickerViewController.m 
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 

NSLog(@"Selected Color: %@. Index of selected color: %i", [arrayColors objectAtIndex:row], row); 
} 

Pero quiero mostrar la fila seleccionada para cada componente en un UIAlertViewcuando el usuario toca una UIButton.

¿Hay alguna manera de hacerlo? ¿O debo simplemente usar 3 invisible UILabels como buffer?

Gracias de antemano.

Respuesta

46

Así, en su método de acción botón, puede hacer algo como esto:

- (IBAction) showAlert { 
    NSUInteger numComponents = [[myPickerView datasource] numberOfComponentsInPickerView:myPickerView]; 

    NSMutableString * text = [NSMutableString string]; 
    for(NSUInteger i = 0; i < numComponents; ++i) { 
    NSUInteger selectedRow = [myPickerView selectedRowInComponent:i]; 
    NSString * title = [[myPickerView delegate] pickerView:myPickerView titleForRow:selectedRow forComponent:i]; 
    [text appendFormat:@"Selected item \"%@\" in component %lu\n", title, i]; 
    } 

    NSLog(@"%@", text); 
} 

Esta sería la manera formal absoluta para recuperar información (mediante el uso de la fuente de datos apropiada y los métodos de delegado), pero podría ser más fácil (dependiendo de su configuración), simplemente tomar la fila seleccionada y luego extraer la información de su modelo directamente, en lugar de pasar por el método delegado.

+2

Gracias! selectedRowInComponent es justo lo que necesitaba. –

+2

Uhm, ¿por qué estás usando un entero sin signo aquí? - [UIPickerView selectedRowInComponent:] también puede devolver -1 si no hay una fila seleccionada. – datwelk

+0

Genial .. !!! Funciona. – Siten

1

Swift 3 Versión:

var value = "" 
for i in 0..<numberOfComponents { 
         let selectedRow = pickerView.selectedRow(inComponent: i) 
         if let s = pickerView.delegate?.pickerView!(pickerView, titleForRow: selectedRow, forComponent: i) { 
          value += s 
         } 
        } 
Cuestiones relacionadas