Mi aplicación requiere que se agreguen las siguientes cosas en una hoja de acción.
- UIToolbar
- Botón en UIToolbar
- Control de UIPicker
He incluido una imagen para comprender mis requisitos.
¿Podría explicar cómo se puede implementar?
ios
iphone
uipickerview
actionsheetpicker
Sagar R. Kothari
fuente
fuente
Respuestas:
Actualización para iOS 7
Documentos de Apple para UIActionSheet :
UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy
Recomiendo no intentar personalizar el contenido de una hoja de acción, ya que puede provocar errores graves de contexto no válido en iOS 7. Acabo de pasar unas horas trabajando en este problema y finalmente decidí adoptar un enfoque diferente. Reemplacé la llamada para mostrar la hoja de acción con un controlador de vista modal que contiene una vista de tabla simple.
Hay muchas formas de lograr esto. Aquí hay una forma que acabo de implementar en un proyecto actual. Es bueno porque puedo reutilizarlo entre 5 o 6 pantallas diferentes donde todos los usuarios pueden seleccionar de una lista de opciones.
SimpleTableViewController
.SimpleTableViewControllerDelegate
con un método requeridoitemSelectedatRow:
y una propiedad débil llamada delegado de tipoid<SimpleTableViewControllerDelegate>
. Así es como devolveremos la selección al controlador padre.itemSelectedatRow:
atableView:didSelectRowAtIndexPath:
.Este enfoque tiene la ventaja adicional de ser bastante reutilizable. Para usar, importe la clase SimpleTableViewController en su ViewController.h, cumpla con SimpleTableViewDelegate e implemente el
itemSelectedAtRow:
método. Luego, para abrir el modal, simplemente cree una nueva instancia de SimpleTableViewController, configure los datos de la tabla y delegue, y preséntelo.Creo un ejemplo simple y lo publiqué en github .
Consulte también Mostrar la hoja de acciones provoca errores de contexto no válido CGContext .
fuente
Una solución más:
sin barra de herramientas pero con un control segmentado (eyecandy)
fuente
Aunque esta pregunta es antigua, mencionaré rápidamente que he reunido una clase ActionSheetPicker con una función de conveniencia, para que pueda generar una ActionSheet con un UIPickerView en una línea. Se basa en el código de las respuestas a esta pregunta.
Editar: ahora también admite el uso de DatePicker y DistancePicker.
UPD:
Esta versión está obsoleta: utilice ActionSheetPicker-3.0 en su lugar.
fuente
ActionSheetDatePicker
modo, puede agregar varios botones a la barra de herramientas en la parte superior. ¿Es esto posible también con lo normalActionSheetStringPicker
?¡Sí! Finalmente lo encuentro.
implemente el siguiente código en su evento de clic de botón, para que aparezca la hoja de acción como se muestra en la imagen de la pregunta.
fuente
La excelente solución de Marcio a esta pregunta fue de gran ayuda para mí al agregar subvistas de cualquier tipo a una UIActionSheet.
Por razones que (todavía) no están del todo claras para mí, los límites de UIActionSheet solo se pueden establecer después de que se haya mostrado; las soluciones de sagar y marcio abordan con éxito esto con un mensaje setBounds: CGRectMake (...) que se envía a la hoja de acciones después de que se muestra.
Sin embargo, establecer los límites de UIActionSheet después de que se haya mostrado la hoja crea una transición brusca cuando aparece ActionSheet, donde "aparece" a la vista, y luego solo se desplaza sobre los últimos 40 píxeles aproximadamente.
Al dimensionar un UIPickerView después de agregar subvistas, recomiendo envolver el mensaje setBounds enviado a actionSheet dentro de un bloque de animación. Esto hará que la entrada de actionSheet parezca más suave.
fuente
Para aquellos tipos que buscan encontrar la función DatePickerDoneClick ... aquí está el código simple para descartar la Hoja de Acción. Obviamente, aac debería ser un ivar (el que va en su archivo .h de implementación)
fuente
Realmente no entiendo por qué
UIPickerView
está entrando unUIActionSheet
. Esta parece ser una solución desordenada y hacky, que puede romperse en una futura versión de iOS. (He tenido cosas como esta interrupción en una aplicación antes, donde elUIPickerView
no se presentaba en el primer toque y tenía que volver a insertarse, peculiaridades extrañas conUIActionSheet
).Lo que hice fue simplemente implementar un
UIPickerView
y luego agregarlo como una subvista a mi vista, y animarlo moviéndose hacia arriba como si se presentara como una hoja de acción.fuente
Para agregar a la increíble solución de marcio,
dismissActionSheet:
se puede implementar de la siguiente manera.Agrega este método a tu código.
fuente
Creo que esta es la mejor forma de hacerlo.
ActionSheetPicker-3.0
Es más o menos lo que todos sugieren, pero usa bloques, ¡lo cual es un buen toque!
fuente
Desde iOS 8, no puede, no funciona porque Apple cambió la implementación interna de
UIActionSheet
. Consulte la documentación de Apple :fuente
Me gustó el enfoque adoptado por Wayfarer y flexaddicted, pero descubrí (como aZtral) que no funcionaba ya que backgroundTapButton era el único elemento que respondía a la interacción del usuario. Esto me llevó a poner sus tres subvistas: _picker, _pickerToolbar y backgroundTapButton dentro de una vista contenedora (emergente) que luego se animó dentro y fuera de la pantalla. También necesitaba un botón Cancelar en _pickerToolbar. Aquí están los elementos de código relevantes para la vista emergente (necesita proporcionar su propia fuente de datos de selector y métodos delegados).
fuente