UIPickerView bloquea la aplicación cuando el usuario está girando componentes al mismo time

Tengo un problema realmente insoportable con UIPickerView. Hay 2 componentes: primero uno con categorías de alimentos y el segundo con alimentos dentro de cada categoría. Tengo matrices adecuadas con alimentos, que se parecen a:

ViewController.h

@property (strong, nonatomic) NSArray *leftPickerDataSource; @property (strong, nonatomic) NSArray *vegetablesDataSource; @property (strong, nonatomic) NSArray *eggsDataSource; @property (strong, nonatomic) NSArray *pastaDataSource; @property (strong, nonatomic) NSArray *riceDataSource; @property (strong, nonatomic) NSArray *meatDataSource; 

ViewController.m

 ... @implementation ViewController @synthesize foodPicker; @synthesize leftPickerDataSource; @synthesize vegetablesDataSource; @synthesize eggsDataSource; @synthesize pastaDataSource; @synthesize riceDataSource; @synthesize meatDataSource; - (void)viewDidLoad { [super viewDidLoad]; self.leftPickerDataSource = [NSArray arrayWithObjects: @"Vegetables", @"Eggs", @"Pasta", @"Rice", @"Meat", nil]; self.vegetablesDataSource = [NSArray arrayWithObjects:@"Potatoes", @"Broad bean", @"Beans", @"Broccoli", @"Cabbage", @"Cauliflower", @"Corn", nil]; self.eggsDataSource = [NSArray arrayWithObjects:@"Soft-boiled", @"Hard-boiled", nil]; self.pastaDataSource = [NSArray arrayWithObjects:@"Pasta", @"Spaghetti", nil]; self.riceDataSource = [NSArray arrayWithObjects:@"White", @"Brown", @"Black", @"Red", nil]; self.meatDataSource = [NSArray arrayWithObjects:@"Sausages", @"Crabs", @"Lobsters", @"Shrimps", nil]; } 

Creo que las matrices no son el problema, pero cuando hago girar dos componentes del selector al mismo time, la aplicación generalmente falla con EXC_BAD_ACCESS (Código = 1 …).

Aquí va mi UIPickerView:

ViewController.m

 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == 0) { // Left picker return [leftPickerDataSource count]; //[foodPicker selectRow:0 inComponent:1 animated:YES]; } else { // Right picker NSInteger sRow = [foodPicker selectedRowInComponent:0]; if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Vegetables"]) return [vegetablesDataSource count]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Eggs"]) return [eggsDataSource count]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Pasta"]) return [pastaDataSource count]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Rice"]) return [riceDataSource count]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Meat"]) return [meatDataSource count]; } } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if (component == 0) { // Left picker return [leftPickerDataSource objectAtIndex:row]; } else { // Right picker NSInteger sRow = [foodPicker selectedRowInComponent:0]; if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Vegetables"]) return [vegetablesDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Eggs"]) return [eggsDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Pasta"]) return [pastaDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Rice"]) return [riceDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:sRow] isEqual:@"Meat"]) return [meatDataSource objectAtIndex:row]; } } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (component == 0) [foodPicker reloadComponent:1]; } 

No puedo encontrar nada sospechoso aquí también. No tengo idea de por qué, pero girar las ruedas bloquea la aplicación. Busqué respuestas a SO, pero nada ayuda: /

¿Tienes alguna idea de lo que pasa?

De hecho, me equivoqué en mi suposition: la fila seleccionada no es indefinida ni nula, pero está cambiando rápidamente mientras giras. El problema es que el número que devuelve en numberOfRowsInComponent depende de dónde está el dial giratorio cuando se ejecuta ese método, pero cuando se ejecuta titleForRow, el primer componente está en una fila diferente y está intentando acceder a filas que no existe. Para solucionarlo, debe definir una propiedad sRow, asignarle un valor en numberOfRowsInComponent, y luego usar ese mismo valor (no volver a asignar como lo está haciendo ahora) en titleForRow, en lugar de get un nuevo valor.

 @property (nonatomic) NSInteger sRow; - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { if (component == 0) { // Left picker return [leftPickerDataSource count]; //[foodPicker selectRow:0 inComponent:1 animated:YES]; } else { // Right picker self.sRow = [foodPicker selectedRowInComponent:0]; if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Vegetables"]) return [vegetablesDataSource count]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Eggs"]) return [eggsDataSource count]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Pasta"]) return [pastaDataSource count]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Rice"]) return [riceDataSource count]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Meat"]) return [meatDataSource count]; } } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { if (component == 0) { // Left picker return [leftPickerDataSource objectAtIndex:row]; } else { // Right picker if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Vegetables"]) return [vegetablesDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Eggs"]) return [eggsDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Pasta"]) return [pastaDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Rice"]) return [riceDataSource objectAtIndex:row]; else if ([[leftPickerDataSource objectAtIndex:self.sRow] isEqual:@"Meat"]) return [meatDataSource objectAtIndex:row]; } } 

Si desea que ambos se desplacen juntos, ¿cuál es el propósito de hacer dos componentes?

Si los valores de su primer componente dependen del componente zeroth, lo ideal sería que no tenga sentido desplazarse por varios componentes juntos.

Puede hacer que múltiples selectores tengan un solo componente.

Actualización : una opción más, puede implementar lógica de tal forma que hasta que el usuario select la aplicación de componente zeroth no se muestre el primer componente, llamado uipickerview dependiente. Echa un vistazo a esta pregunta: Pregunta