2012-09-06 12 views
10

Sto provando a completare un'applicazione su IOS 5.1 con Storyboard. Fondamentalmente sto facendo un'app dropbox. Dal momento che sto usando il link Dropbox SDK a Dropbox viene gestito in AppDelegate.m. L'utente ha la possibilità di essere in grado di scollegare da una sessione e collegarsi di nuovo in diversi View Controller. Quindi, tutti i link all'utente tempo e applicazione scollegato deve cambiare la visualizzazione da AppDelegate a un controller di vista che è estraneo a RootViewControllerCome eseguire Segue in AppDelegate?

In originale esempio di Dropbox Dropbox ha gestito la transizione come codice seguente

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) { 
     if ([[DBSession sharedSession] isLinked]) { 
      [navigationController pushViewController:rootViewController.photoViewController animated:YES]; 
     } 
     return YES; 
    } 

    return NO; 
} 

ma sto usando Storyboard con Il controller di navigazione e uno dei seguenti metodi non funzionano. Inserisco i metodi nei commenti.

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) { 
     if ([[DBSession sharedSession] isLinked]) { 

      NSLog(@"App linked successfully!"); 
      // At this point you can start making API calls 

      /*UIViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"MeetingViewController"]; 
      [self.navigationController pushViewController:viewController animated:YES]; */ 

      //[self performSegueWithIdentifier:@"xxxx" sender:self]; 

      /* LoginDropboxViewController *loginController=[[LoginDropboxViewController alloc] initWithNibName:@"LoginDropbox" bundle:nil]; 
      [navigationController pushViewController:loginController animated:YES]; */ 

     } 
     return YES; 
    } 
    // Add whatever other url handling code your app requires here 
    return NO; 
} 

Ecco lo storyboard delle app enter image description here

Allora, come posso cambiare la visualizzazione in AppDelegate.h?

Nota: se aggiungo un seguito e un nome al seguito, diciamo goToMeeting [self performSegueWithIdentifier: @ "goToMeeting" mittente: self];

errore che ottengo è: No Visible @interface for 'AppDelegate' declares the selector performSegueWithIdentifier:sender

risposta

12

Se si considera vista spingendo manualmente piuttosto che segueperform seguente codice molto probabilmente lavorerà per voi

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { 
    if ([[DBSession sharedSession] handleOpenURL:url]) { 
     if ([[DBSession sharedSession] isLinked]) { 

      NSLog(@"App linked successfully!"); 
      // At this point you can start making API calls 

      //push view manually 
      UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
      LoginDropboxViewController *ivc = [storyboard instantiateViewControllerWithIdentifier:@"LoginDropbox"]; 
      [(UINavigationController*)self.window.rootViewController pushViewController:ivc animated:NO]; 



    } 
     return YES; 
    } 
    // Add whatever other url handling code your app requires here 
    return NO; 
} 
5

Si può fare in questo modo:

UINavigationController *navigationController = (UINavigationController*) self.window.rootViewController; 

[[[navigationController viewControllers] objectAtIndex:0] performSegueWithIdentifier:@"goToMeeting" sender:self]; 

Questo funziona solo se l'indice nell'array viewControllers corrisponde a quello del controller della vista e se esiste, ovviamente. In questo caso è il primo (nell'array e nello storyboard).

Il seguito ("goToMeeting") non deve essere collegato a un'azione. Il modo in cui lo fai è controllando il trascinamento dall'icona del proprietario del file nella parte inferiore della scena dello storyboard alla scena di destinazione. Apparirà un popup che chiederà un'opzione in "Segmento manuale"; seleziona "Push" come tipo. Tocca il quadratino e assicurati di essere nell'Inspector degli attributi. Dagli un identificatore che userai per fare riferimento ad esso nel codice.

+3

Ma cosa posso fare se devo passare i dati dei parametri alla chiamata performSegueWithIdentifier. Nel delegato dell'app non c'è il ViewController, quindi non posso sovrascrivere la chiamata prepareForSegue()? – ChaosSpeeder