ios - PreparForSegue no recibe ninguna llamada cuando hago clic en un botón sin usar performSegueWithIdentifier
segue swift 4 (10)
Al conectar un segmento automático para una vista de tabla, además de la respuesta de Amro (que no asigna su subclase correspondiente), hay otros dos casos en los que prepareForSegue
posible que no se llame a prepareForSegue
. Asegúrate de que has
conectó el segmento de la celda prototipo de vista de tabla, no el controlador de vista de tabla.
utilizó un segmento de debajo del grupo "Segmento de selección" en el menú emergente de conexión de segmento, no uno debajo de "Acción accesoria".
[Haga clic en la imagen para ampliar]
Basado en el curso de iOS de Stanford, estoy jugando con controladores de vista modales. En la demostración tienen un botón que iniciaría una vista modal y cuando se hace clic en la función prepareForSegue se llama. Imité el código y la implementación en mi proyecto, con la única diferencia es que mi demostración está en un storyboard de iPhone y la suya en el iPad.
Noté que mientras se enciende mi controlador de vista modal, no llama a prepareForSegue antes de eso. Busqué en el proyecto de Stanford para ver dónde pueden registrar cualquier comportamiento de seguridad antes de que se llame a prepareForSegue, pero no hay pruebas. Alguien puede arrojar algo de luz sobre esto. Busqué el desbordamiento de pila y todo lo que encontré fue que a los usuarios les faltaba la implementación de la llamada a performSegueWithIdentifier. Sin embargo, en la demo de Stanford nunca hacen eso.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasPrefix:@"Create Label"]) {
AskerViewController *asker = (AskerViewController *)segue.destinationViewController;
asker.question = @"What do you want your label to say?";
asker.answer = @"Label Text";
asker.delegate = self;
}
}
Aquí hay un ejemplo de allí storyboard:
Aquí hay un ejemplo de mi storyboard:
En el depurador, cuando me detengo en el código de demostración de Stanford, la pila de llamadas muestra que el guión gráfico está realizando una acción segue, ¿qué debo configurar en mi guión gráfico para lograr el mismo resultado?
Bueno, resulta que mi controlador de vista donde el botón llama a la vista modal no tenía la clase correcta donde se implementa prepareForSegue. Era el UIViewController predeterminado en lugar de mi clase personalizada.
La forma en que lo descubrí fue poniendo un punto de interrupción en viewDidLoad e incluso eso no se rompió y, por lo tanto, sospeché que en el guión gráfico no tenía la clase correcta asociada con la vista donde se implementa el botón.
En mi caso, no configuré el módulo con el nombre de la clase en el guión gráfico del controlador de vista que contiene el segmento. Se estableció en ninguno y, una vez que hice clic en el campo del módulo, se estableció en el proyecto / módulo correcto y se resolvió el problema.
En mi caso, se produjo porque mi controlador estaba extendiendo otro controlador (Eureka Form View Controller = FormViewController) que ha implementado la función performSegue de esta manera:
open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Mi función fue implementada así:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Para resolver esto, acabo de agregar anular antes:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Voila!
En mi caso, tengo una clase base para varios controladores de vista en mi proyecto. Esa clase base tiene una implementación de prepareForSegue()
que no fue llamada en todos los casos. El problema fue que en uno de mis controladores de vista que hereda de la clase base y anula su implementación prepareForSegue()
, olvidé llamar a super.prepareForSegue()
.
En primer lugar, debe seleccionar en su botón + ctrl elemento de arrastre para ver el controlador, elegir la selección de segue. Más tarde, debe nombrar correctamente el identificador de segue.
No conecte un controlador de vista a otro controlador de vista. Importe UIKit.framework para esto. Entonces se llamará a este método.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"identifierName"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ExampleViewController *destViewController = segue.destinationViewController;
}
}
Para otros con este problema, si ahora está utilizando Swift 3, la función siguiente no generará errores, ya que es la sintaxis correcta pero no funcionará porque es la función Swift 2:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// code
}
Debe actualizar a Swift 3 "prepare" la función para que funcione para los segmentos:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
Si siempre se llamará un código Modal o Empuje Segue debajo
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Create Label"]) {
SignUpViewController *asker = segue.destinationViewController;
}
}
Tuve un problema similar
El proceso de pensamiento fue:
- Asegúrese de tener la firma del método correcto. Ha cambiado en Swift 3.
- Luego, asegúrate de que la forma en que conectaste el botón (o lo que sea que active el segue) coincida con la forma en que conectaste el segue en el guión gráfico. A veces se llama un botón, pero no se ha conectado correctamente el segmento de ese botón al controlador de vista de destino.
- Asegúrese de que el identificador de la señal es correcto. Aunque esta no es la razón por la que no se llama a prepareForSegue, esta es solo la razón por la que no se llama a un segmento específico.
Tuve un problema similar con UICollectionViewCell
como la fuente de segue.
Parece que para que la función de guión gráfico funcione (sin performSegueWithIdentifier
) se requiere que tenga una subclase personalizada de UICollectionViewCell
, y la use como una Class
para el CollectionViewCell
en el storyboard.