2011-01-30 10 views
7

Tengo una UIActionSheet que contiene un selector y una UIToolbar. En la UIToolBar hay un botón para guardar. Sin embargo, algunos de mis usuarios informaron presionar el botón de guardar antes de que el UIPickerView dejara de girar y solo recuperara el valor inicial (antes de girar).detener programáticamente la animación de uipickerview en iphone

¿Hay alguna manera de obtener el elemento actualmente seleccionado de UIPickerView una vez que el usuario toca Guardar o recibir comentarios del elemento seleccionado activo mientras está girando?

Gracias

+0

¿Qué quieres decir con spinning? El único elemento giratorio en la interfaz de usuario de iPhone que conozco es UIActivityIndicatorView – Max

+0

No lo he intentado, pero ¿qué pasaría si haces esto mientras giras? '[picker selectRow: [selector seleccionadoRowInComponent: i] enComponent: i animado: YES];' para cada componente 'i' que tiene? – nacho4d

+0

@Max en iPhone, puedes deslizar hacia abajo en el uipickerview para hacer que gire (estilo de tragamonedas) – zsniperx

Respuesta

0

El botón "Guardar" clic, se puede recuperar el objeto seleccionado de su componente

[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]]; 

donde,

  • "component1Array" es una NSArray o NSMutableArray , objeto que solía mostrar los objetos (contenidos sin procesar) en su componente.
  • "myPicker" es un objeto UIPickerView que muestra el selector.
  • "[myPicker selectedRowInComponent: 1]" devolverá el raw raw actualmente seleccionado de myPicker en el componente '1'.

Y "[myPicker selectedRowInComponent: 2]" devolverá el no seleccionado actualmente seleccionado de myPicker en el componente '2'. Puede recuperar el objeto seleccionado de su Componente2 por

[component2Array objectAtIndex:[myPicker selectedRowInComponent:2]]; 

espero que funcione para usted.

+2

El problema es que cuando se hace clic en el botón Guardar, si la vista del seleccionador todavía está girando, entonces su fila seleccionada aún no se ha establecido. Esto siempre devolverá la fila seleccionada previamente, no en la fila en la que aparezca el resaltado de selección, por lo que no se solucionará el problema. El problema es cómo uno le dice a la vista del seleccionador a la fuerza que seleccione la fila en la que aparece durante un centrifugado. No creo que puedas. – Jasarien

1

No creo que sea un problema que pueda resolver con UIPickerView por sí mismo.

No hay forma ahora de seleccionar la fila sin detener la animación (y por lo tanto la vista del seleccionador seleccionando la fila donde se detuvo). La única forma sería decirle al selector en qué fila detenerse, utilizando el selectRow:inComponent:animated:, pero ¿cómo sabrá qué fila es? No lo sabe porque el selector está girando ...

Creo que esto es solo una limitación del UIPickerView y Apple probablemente lo describa como el comportamiento esperado.

+0

Puede obtener la fila actual utilizando el método seleccionado de RowRComponent de pickerView, incluso pickerView está girando. –

2

¿Alguna vez ha pensado en usar el método titleForRow para resolver esto. Como se está desplazando el pickerview, se llama al método titleForRow para rellenar las filas por encima o por debajo de la fila actualmente visualizada (dependiendo de qué dirección esté girando el selector). Cuando el selector se detiene, se llama al método didSelectRow y la fila devuelta está a 2 filas de la última fila del método titleForRow.

Creo que podría elegir detener el selector en algún momento (temporizadores para detectar puntos que se usan para indicar el código en titleForRow para capturar componente y fila de la llamada) en el desplazamiento y luego hacer un selectRow para establecer el valor de lo que quiere que sea después de dejar de girar (y se llama al didSelectRow).

4

Incluso si descartan el selector mientras todavía está girando, el selector llamará al delegado con la fila final seleccionada una vez que se detenga, incluso si no está visible. Suponiendo que aún no lo haya desasignado, puede configurar el receptor delegado para que verifique si el selector está visible, y si no lo está, guarde el valor seleccionado.

Lo hago asumiendo que está claro que el usuario no está desplazándose a un valor aleatorio, generalmente cuando se desplazan y descartan sin esperar a que se establezca, significa que se desplazaron a la parte superior o inferior de la lista. Yo diría que puedes usar el resultado del delegado de forma segura en estos dos casos.

+0

¡Usted es la respuesta más cercana hasta ahora! Parecería que es una solución válida. Sin embargo, mi selector está en una UIActionSheet, por lo que se lanzará después de presionar un botón en la barra de herramientas en la UIActionSheet, que es muy probable que suceda mientras gira porque no hay tantas filas. ¿Alguna sugerencia de cómo solucionar esto o detenerlo programáticamente? Vota de todos modos, – zsniperx

+0

¡Muchas gracias, Shaun, pateándome un poco por no haber pensado en esto en primer lugar, pero totalmente ayudado por mí! ¡Gracias otra véz! – crojassoto

1

Tuve el mismo problema ... Lo arreglé simplemente al agregar la siguiente línea de código en el método que cierra o selecciona el valor del selector.

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES]; 
1

Acaba de encontrar la solución, que funciona para mi caso. No necesito el último evento de actualización, generado cuando el selector deja de girar después de que el usuario lo haya descartado. Por lo tanto, este método deja de desplazarse y no causa un nuevo evento de selección de actualización. Parece que va a verificar si las selecciones son aceptables en el selector después de esto (no me importa, vuelvo a seleccionar los valores cuando le muestro al selector).

- (void)_resetPickerViewDelegates { 
    id delegate = [_pickerView.delegate retain]; 
    id dataSource = [_pickerView.dataSource retain]; 

    _pickerView.delegate = nil; 
    _pickerView.dataSource = nil; 
    [_pickerView reloadAllComponents]; 
    _pickerView.delegate = delegate; 
    _pickerView.dataSource = dataSource; 

    [delegate release]; 
    [dataSource release];  
} 
0

Esto podría ser un "truco", pero funciona. Mi caso es ligeramente diferente. Estoy usando un UIPicker, pero puedo cambiar el objeto de su manipulación.

Mi problema es que puedes seleccionar un objeto, girar el selector, y mientras está terminando su giro, selecciona un objeto diferente. Lo que terminó sucediendo fue que el nuevo objeto obtenía el valor final de ese giro, en lugar de ser ignorado.

Lo que hice al configurar el UIPicker le daría un tag único basado en el objeto que se suponía que debía actualizar.

- (void)updatePickerView:(UIPickerView*)pickerView 
{ 
    ... 
    pickerView.tag = [self.myObject.position integerValue]; 
    [pickerView selectRow:i inComponent:0 animated:NO]; 
} 

Luego, cuando termina su giro, compruebo que las etiquetas estén alineadas.

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
    { 
     if (pickerView.tag == [self.myObject.position integerValue]) { 
      ... 
     } 
    } 

No estoy seguro de cómo funciona en el lado de Apple, pero esto fue suficiente para que funcione para mí.

Como nota al margen, y no estoy seguro de si esto es importante, pero mi UIPicker está en una UITableViewCell pero ya que es una célula reutilizable y porque estaba teniendo los problemas que yo era, asumo la UIPicker es la lo mismo cuando se mueve de una posición a otra (ya que solo hay una en pantalla a la vez).

Cuestiones relacionadas