iOS 以编程方式转到选项卡和推送视图控制器

Posted

技术标签:

【中文标题】iOS 以编程方式转到选项卡和推送视图控制器【英文标题】:iOS Programmatically go to Tab AND Push View Controller 【发布时间】:2014-05-23 20:12:23 【问题描述】:

我的应用与 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];

我怎样才能让它回到应用程序中,更改标签栏,并从该标签启动正确的视图

【问题讨论】:

您的问题无法理解。问题是为什么不调用 viewPrayer,还是如何让它回来(无论“它”是什么,“回来”是什么意思,都不清楚这些是什么,也不清楚问题的焦点)。 @MartinH 请参阅我编辑的问题以进行澄清。 从代码来看,没有理由不调用 viewPrayer,因此我怀疑您发布的代码正在执行。你如何确认它没有被调用?您是否在 viewPrayer 中设置了一个断点,并在 [_webViewController viewPrayer] 行设置了另一个断点? 我无法使用控制台。每次我在我的 5S 上运行它时,它都会安装它并运行,但 Xcode 从未检测到它,并结束调试 sessino 现在发个问题有点没意义,你需要先学习如何使用Xcode进行调试。您发布的代码甚至没有被调用(我的意思是第一段代码),所以这显然是 viewPrayer 没有被调用的原因。没有人能回答为什么不。您必须学习如何调试代码并学习如何使用 Xcode,如果您有更多信息,请来这里。 【参考方案1】:

斯威夫特 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)
        
    )

【讨论】:

【参考方案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 的原因是始终在其第一个视图控制器上保持该堆栈新鲜导航堆栈。但是,您对此的要求可能与我的不同。

【讨论】:

以上是关于iOS 以编程方式转到选项卡和推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

iOS – 在导航堆栈中显示一个视图控制器

xcode/ios:以编程方式推送视图控制器并传递行信息

无法在 IOS8 中使用 showSegue 以编程方式“推送”视图控制器

如何使用选项卡和导航控制器实例化视图控制器以进行深度链接?

如何以编程方式在导航控制器上推送下一个视图控制器?

推送新的视图控制器(以编程方式)不起作用?为啥?