Tengo un UIPickerView con celdas personalizadas. Para cada momento, me gustaría saber qué celda está en el centro (detrás del indicador de selección tintado). El método delegado UIPickerViewPosición de lectura de PickerView mientras se desplaza
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
proporciona esta información, pero solo después de que se haya detenido la vista del selector. Lo que estoy buscando es una forma de recuperar la celda actualmente "seleccionada" mientras la vista del seleccionador todavía está girando y aún no se ha detenido.
Como solución, he tratado de pasar por MVA y registrarse para ver los cambios de cada célula:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
.
.
[cell addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
}
hago recibir devoluciones de llamada a observeValueForKeyPath: ofObject: el cambio: contexto :, sin embargo, no importa si me desplazar la vista selector hacia arriba o hacia abajo, los valores recibidos parecen ser siempre la misma:
2011-03-09 08:00:34.429 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.430 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.430 Project[35069:207] Change: {
kind = 1;
new = "NSRect: {{2, -13}, {118, 70}}";
old = "NSRect: {{2, -13}, {118, 70}}";
}
2011-03-09 08:00:34.431 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.431 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.432 Project[35069:207] Change: {
kind = 1;
new = "NSRect: {{2, -13}, {118, 70}}";
old = "NSRect: {{2, -13}, {118, 70}}";
(Location coordinates are in window frame)
Cualquier otra idea lo que podría tratar de conseguir ese valor?
Vi esta idea en otro lado, pero parece un poco insegura. Nunca se sabe cuántas vistas estarán exactamente precargadas. El número puede variar en las diferentes versiones de iOS, tal vez también dependiendo de la disponibilidad de la memoria del dispositivo. He buscado en la documentación, pero no pude encontrar nada especificado al respecto. –
Definitivamente no hay garantías, y como mencioné anteriormente, la técnica no está exenta de defectos. Recomiendo absolutamente pruebas minuciosas. Sin embargo, a menos que tenga su propia vista de selector, creo que es lo más cercano que recibirá la notificación en tiempo real de los cambios al selector. – Caleb
Hago esto, donde compruebo que cada cambio es consecutivo, como pickerView: titleForRow: forComponent: preselecciona filas de forma aleatoria, por lo que mantengo la fila anterior en algún lugar y actúo solo si es una arriba o una abajo: ~ if (row == self.oldrow + 1 || row == self.oldrow - 1) ~ –