2013-04-06 14 views
5

Ho un'app per controller Tab Bar che utilizza lo storyboard. Ogni scheda ha una UIWebview. Voglio catturare il collegamento quando l'utente fa clic sul collegamento su Webview se il collegamento è un collegamento esterno (se non è il mio sito) Voglio aprire il collegamento in un altro UIViewControl. (come un'app per iphone iphone popupi)pushViewController non funziona con TabbarController

In questo momento; Ho ottenuto questo codice per catturare il collegamento (se il link è bing.com allora dovrebbe aprirlo un altro controller di visualizzazione) ma non riesco ad aprire un altro UIViewController (in questo caso PopViewController). Mi dà questo errore:

No @interface visibile per 'GundemViewController' dichiara il selettore 'pushViewController: animato:'

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 

//CAPTURE USER LINK-CLICK. 

NSURL *url = [request URL]; 

NSString *urlString = [url absoluteString]; 

/****** 
UIWebViewNavigationTypeLinkClicked: When user click on a link in the app it senses the action 
*/ 

if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
    if ([urlString hasPrefix:@"http://www.bing.com/"]) { 

     PopViewController *popUpView = [[PopViewController alloc] initWithNibName:@"PopupViewController" bundle:nil]; 

     [self pushViewController:popUpView animated:YES]; 
     return NO; 
    } 
} 


return YES; 
} 

risposta

10

È possibile incorporare i controller di navigazione in ogni scheda, in modo che invece di:

UITabBarController 
    Tab1 View Controller 
    Tab2 View Controller 
    Tab3 View Controller 

voi hanno

UITabBarController 
    Tab1 Navigation Controller 
     Tab1 View Controller 
    Tab2 Navigation Controller 
     Tab2 View Controller 
    Tab3 Navigation Controller 
     Tab3 View Controller 

e così via. È possibile chiamare solo -pushViewController:animated: su un'istanza di un controller di navigazione.

Nel delegato dell'app, è possibile inizializzare ciascuno dei controller di visualizzazione, inserirli in un array e quindi assegnare tale array al controller della barra delle schede. Per aggiungere i controller di navigazione, si dispone di un passo in più:

UIViewController *tab1Controller = [[MyViewController alloc] initWithNibNamed:@"MyViewController" bundle:nil]; 
UINavigationController *tab1Nav = [[UINavigationController alloc] initWithRootViewController:tab1Controller]; 

// etc 

quindi impostare la gamma di controller di vista per la vostra scheda del controller bar per i controller di navigazione che hai creato.

Nella tua vista controller, anziché chiamare -pushViewController:animated: su self, lo chiamerai su self.navigationController.

edit:

Se non si desidera un controller di navigazione, è possibile utilizzare

[self presentViewController:popUpView 
        animated:YES 
       completion:nil]; 

per presentare il pop-up. Nel popup, quando l'utente tocca il pulsante di chiusura, utilizzare

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

per chiuderlo.

+0

Fondamentalmente trascino e rilasciamo un Tabbarcontroller nello stage (storyboard) di quanto sto cercando di creare un popup (separato da tutte le schede correnti e altre cose) Voglio solo creare un controller vista dall'alto e quando l'utente fa clic sul pulsante di chiusura. Devo ignorare –

+0

Vedere le modifiche sopra. –

+0

Seamus Ho capito che qualsiasi idea sarà apprezzata *** WebKit ha scartato un'eccezione non rilevata nel webView: decidePolicyForNavigationAction: request: frame: decisionListener: delegate: Impossibile caricare NIB in bundle: 'NSBundle (caricato) 'con nome' PopupViewController ' –

1

Che cosa è GundemViewController? Scopri perché viene restituito da self.navigationController anziché da UINavigationController. Un modo per farlo è impostare un punto di interruzione appena prima di premere il controller di visualizzazione e quindi passare alla chiamata self.navigationController.

+0

GundemViewController è un UIViewController. Potresti controllare di nuovo quella parte. Ho modificato quella parte. –

+0

Non è possibile chiamare '-pushViewController: animated:' su qualsiasi controller di visualizzazione precedente. Devi chiamarlo su un 'UINavigationController'. Il modo più semplice per farlo è chiamare 'self.navigationController', che restituirà il controller di navigazione al momento in cui si trova il controller di visualizzazione. –

+0

Ma quando sto facendo questo self.navigationController non succede niente? Questo è il problema che sto cercando di risolvere. Mi manca qualcosa? un metodo o qualcosa? –