iOS以编程方式转到Tab AND Push View Controller

时间:2014-05-23 20:12:23

标签: ios uinavigationcontroller uitabbarcontroller pushviewcontroller

我的应用与Facebook Deep Link for Open Graph相关联。当在Facebook应用程序中单击打开的图形故事时,它会返回到我的应用程序。我希望它在第二个标签中返回我的应用程序,然后在屏幕上显示一个新的视图控制器。

在我的appDelegate中,当从Facebook完成操作时,我有:

 NSString *objectId = [[[call appLinkData] targetURL].path substringFromIndex:1];
 NSString *nameofhtml = [[objectId lastPathComponent] stringByDeletingPathExtension];
// now handle the deep link
// write whatever code you need to show a view controller that displays the object, etc.

      if (_webViewController == nil) {
          self.webViewController = [[PrayerGifts alloc] init];
       }
     _webViewController.fromFacebook = nameofhtml;
      [self.tabBarController setSelectedIndex:1];
      [_webViewController viewPrayer];

这成功地设置了我想要它的选项卡,但是_webViewController中名为viewPrayer的方法永远不会被调用。那个方法是:

Prayer *gonow = [[Prayer alloc] init];
    gonow.currentURL = fromFacebook;
    [self.navigationController pushViewController:gonow animated:YES];
    [gonow release];

如何让它回到应用程序,更改标签栏,并从该标签启动正确的视图

2 个答案:

答案 0 :(得分:2)

我今天遇到了这个问题,找到了一个对我有用的简单解决方案。我有一个带有4个选项卡的TabBarController。我需要从选项卡2中的深视图控制器层次结构到选项卡4中的嵌套视图控制器。这是我的工作方式。

  func goToHelpViewController(){
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.tabBarController?.selectedIndex = 3
                let settingsStoryBoard = UIStoryboard(name: "SettingsSection", bundle: nil)
                let helpViewController = settingsStoryBoard.instantiateViewControllerWithIdentifier("HelpViewController") as! HelpViewController
                let settingsRootNavigationController = self.tabBarController?.viewControllers![3] as! UINavigationController

      settingsRootNavigationController.popToRootViewControllerAnimated(false)
                settingsRootNavigationController.pushViewController(helpViewController, animated: true)
            })
        }

我对此进行了测试,您必须在从所需选项卡获取导航控制器之前设置所选索引。设置索引后,您将获得所需选项卡的导航控制器,并将其推送到所需选项卡的导航控制器堆栈。我在settingsRootNavigationController上调用popToRootViewController的原因是始终在第一个视图控制器上保持该堆栈的新鲜在其导航堆栈中。但是,您对此的要求可能与我的要求不同。

答案 1 :(得分:1)

Swift 3.1

func goToChatViewController(){
    DispatchQueue.main.async(execute: { () -> Void in
        self.tabBarController?.selectedIndex = 3
        if let storyboard = self.storyboard {
            let helpViewController = storyboard.instantiateViewController(withIdentifier: "HelpViewController") as! HelpViewController
            let settingsRootNavigationController = self.tabBarController?.viewControllers![3] as! UINavigationController

            settingsRootNavigationController.popToRootViewController(animated: false)
            settingsRootNavigationController.pushViewController(chatController, animated: true)
        }
    })
}