Objective C y método prepareForSegue

Bueneas tengo un botón que al ser pulsado cambia a otra View mediante el evento. El evento segue tiene un id que es segueAtabController. Cuando el que llama al evento es ese segue en concreto miro si un método me devuelve YES, si es YES quiero que siga con el cambio de View, pero si es NO quiero que no haga el cambio. Cómo puedo parar un cambio de View o Actividad (en Android se llaman así), una vez entrado en el método prepareForSeue?.

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"segueAtabController"]) {
        if (self.mayorEdad) {
       
        } else {
            break;
        }
    }
}
El método prepareForSegue no tiene forma de detener el segue. Sin embargo hay otro método que puede evitar que este se haga, aunque según leí sólo funciona en iOS 6+.
El cual es:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueAtabController"]) {
        if (self.mayorEdad) {
           return YES;
        } else {
            return NO;
        }
    }
  return NO;
}

Vamos, que regresas YES, si quieres que se haga el segue, y NO sino quieres.
dnL7up escribió:El método prepareForSegue no tiene forma de detener el segue. Sin embargo hay otro método que puede evitar que este se haga, aunque según leí sólo funciona en iOS 6+.
El cual es:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueAtabController"]) {
        if (self.mayorEdad) {
           return YES;
        } else {
            return NO;
        }
    }
  return NO;
}

Vamos, que regresas YES, si quieres que se haga el segue, y NO sino quieres.


Muchísimas gracias por responder :) Tiene toda la ipnta de que esto resolverá "mi problema", en un rato lo pruebo. Sólo una cosa, si te fijas el método prepareForSegue sí que puede saber qué segue lo ha lanzado mira.
  if ([[segue identifier] isEqualToString:@"segueAtabController"]) {

con el método identifier del segue que recibe como parámetro. Lo que ya no puedo hacer es lo de devolver YES si quiero que se lleve a cabo y NO si no quiero que se siga con el cambio.

De nuevo muchísimas gracias, en breve lo pruebo :p :p
Guantanamera escribió:
dnL7up escribió:El método prepareForSegue no tiene forma de detener el segue. Sin embargo hay otro método que puede evitar que este se haga, aunque según leí sólo funciona en iOS 6+.
El cual es:
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"segueAtabController"]) {
        if (self.mayorEdad) {
           return YES;
        } else {
            return NO;
        }
    }
  return NO;
}

Vamos, que regresas YES, si quieres que se haga el segue, y NO sino quieres.


Muchísimas gracias por responder :) Tiene toda la ipnta de que esto resolverá "mi problema", en un rato lo pruebo. Sólo una cosa, si te fijas el método prepareForSegue sí que puede saber qué segue lo ha lanzado mira.
  if ([[segue identifier] isEqualToString:@"segueAtabController"]) {

con el método identifier del segue que recibe como parámetro. Lo que ya no puedo hacer es lo de devolver YES si quiero que se lleve a cabo y NO si no quiero que se siga con el cambio.

De nuevo muchísimas gracias, en breve lo pruebo :p :p


Es cierto, no me había fijado que este otro método no te manda el objeto "sugue", aunque si te manda un objeto "identifier" que me imagino que te servirá para la comprobación que buscas hacer.
dnL7up efectivamente el método me ha servido. Nunca te acostarás sin aprender algo nuevo!. Muchísimas gracias por tu ayuda!

Un saludo
De nada, me alegra que te sirviera. :)
Aunque ya esté respondido quiero comentar una cosa, si os dais cuenta el método prepareForSegue devuelve void, por lo que no tiene ninguna posibilidad de devolver un valor que provoque que el runtime no ejecute la transición entre vistas. Todos los procesos del API tienen un método inicial que devuelven BOOL para hacer justamente lo que querías, (y todos empiezan por should), así que si alguien que lea esto vuelve a tener un problema similar que busque el método que empieza por should para abortar que el proceso se ejecute.

Saludos,
Y si intentas &&?
if([[segue identifier] isEqualToString:@"segueAtabController"]&&[self yesOrNo]==Yes)
me parece mucho más sencillo
7 respuestas