2013-04-06 10 views
5

Ich habe eine Tab Bar Controller App, die Storyboard verwenden. Jeder Tab hat eine UIWebview. Ich möchte einen Link erfassen, wenn der Benutzer auf den Link in Webview klickt, wenn der Link ein externer Link ist (wenn es nicht meine Site ist) Ich möchte den Link in einem anderen UIViewControl öffnen. (wie eine Popupi Twitter iPhone App das tun)pushViewController funktioniert nicht mit TabbarController

gerade jetzt; Ich habe diesen Code, um den Link zu erfassen (wenn der Link bing.com ist, sollte es einen anderen View-Controller öffnen), aber ich kann keinen anderen UIViewController (in diesem Fall PopViewController) öffnen. Es gibt mir diese Fehlermeldung:

Keine sichtbaren @interface für 'GundemViewController spricht der Wähler 'Pushviewcontroller: animated:'

- (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; 
} 

Antwort

10

Sie können Navigation-Controller in jeder Registerkarte einbetten, so dass statt:

UITabBarController 
    Tab1 View Controller 
    Tab2 View Controller 
    Tab3 View Controller 

Sie haben

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

und so weiter. Sie können -pushViewController:animated: nur auf einer Instanz eines Navigationscontrollers aufrufen.

In Ihrem Anwendungsdelegaten initialisieren Sie wahrscheinlich alle View-Controller, fügen sie in ein Array ein und weisen das Array dann dem Tab-Bar-Controller zu. Zur Navigation-Controller hinzuzufügen, haben Sie einen zusätzlichen Schritt:

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

// etc 

Sie dann die Anordnung von View-Controller für Ihre Tab-Leiste Controller zu den Navigationscontroller Sie erstellt haben.

In Ihrer Ansicht Controller, anstatt -pushViewController:animated: auf self anrufen, rufen Sie es auf self.navigationController.

edit:

Wenn Sie nicht über einen Navigationscontroller mögen, können Sie verwenden

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

das Pop-up zu präsentieren. Wenn der Benutzer im Pop-up-Fenster die Schaltfläche zum Schließen berührt, kann er mit

diesen Vorgang abbrechen.

+0

Im Grunde ziehe ich einfach einen Tabbarcontroller in die Bühne (Storyboard), als ich versuche, ein Popup zu erstellen (getrennt von allen aktuellen Tabs und anderen Dingen). Ich möchte nur einen Topview Controller erstellen und wenn der Benutzer auf das Symbol klickt Schaltfläche schließen Ich muss –

+0

ablehnen Siehe Änderungen oben. –

+0

Seamus Ich habe, dass jede Idee wird geschätzt *** WebKit verworfen eine nicht abgefangene Ausnahme in der WebView: decidePolicyForNavigationAction: Anfrage: Frame: DecisionListener: Delegate: Konnte NIB nicht im Bundle laden: 'NSBundle (geladen) 'mit dem Namen' PopupViewController ' –

1

Was ist GundemViewController? Schauen Sie, warum das von self.navigationController anstelle von UINavigationController zurückgegeben wird. Eine Möglichkeit, dies zu tun, besteht darin, einen Haltepunkt zu setzen, kurz bevor Sie den View-Controller drücken und dann in den self.navigationController-Aufruf wechseln.

+0

GundemViewController ist ein UIViewController. Könnten Sie bitte diesen Teil noch einmal überprüfen? Ich habe diesen Teil bearbeitet. –

+0

Sie können '-pushViewController: animated:' nicht auf einem alten View-Controller aufrufen. Sie müssen es auf einem 'UINavigationController' aufrufen. Der einfachste Weg, dies zu tun, ist 'self.navigationController' aufzurufen, was den Navigations-Controller zurückgibt, auf dem sich der View-Controller gerade befindet. –

+0

Aber wenn ich diese self.navigationController mache passiert nichts? Das ist das Problem, das ich versuche zu lösen. Vermisse ich etwas? eine Methode oder etwas? –

Verwandte Themen