pushViewController不能与TabbarController一起使用

时间:2013-04-06 15:02:57

标签: iphone ios pushviewcontroller

我有一个使用故事板的Tab Bar Controller应用程序。每个选项卡都有一个UIWebview。我想在用户单击Webview上的链接时捕获链接,如果链接是外部链接(如果它不是我的站点)我想在不同的UIViewControl中打开链接。 (就像一个popupi Twitter iphone应用程序那样做)

现在;我有这个代码捕获链接(如果链接是bing.com然后它应该打开它另一个视图控制器)但我无法打开另一个UIViewController(在这种情况下PopViewController)。它给了我这个错误:

'GundemViewController'没有可见的@interface声明选择器'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;
}

2 个答案:

答案 0 :(得分:10)

您可以在每个标签中嵌入导航控制器,而不是:

UITabBarController
    Tab1 View Controller
    Tab2 View Controller
    Tab3 View Controller

你有

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

等等。您只能在导航控制器的实例上调用-pushViewController:animated:

在您的app委托中,您可能初始化每个视图控制器,将它们放入一个数组中,然后将该数组分配给选项卡栏控制器。要添加导航控制器,您还需要一个额外的步骤:

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

// etc

然后将标签栏控制器的视图控制器数组设置为您创建的导航控制器。

在您的视图控制器中,您可以在-pushViewController:animated:上调用self,而不是在self.navigationController上调用[self presentViewController:popUpView animated:YES completion:nil];

编辑:

如果您不想使用导航控制器,可以使用

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

显示弹出窗口。在弹出窗口中,当用户触摸关闭按钮时,使用

{{1}}

解雇它。

答案 1 :(得分:1)

什么是GundemViewController?查看为什么从self.navigationController而不是UINavigationController返回。一种方法是在推动视图控制器之前设置断点,然后进入self.navigationController调用。