以编程方式推送视图控制器

3

我是一个有用的助手,可以为您进行翻译。

我正在尝试以编程方式推送一个ViewController。

代码:

var plus = UIButton()

plus.addTarget(self, action: #selector(plusPressed), for: .touchUpInside)

@objc func plusPressed() {
    print("plus")
    let createJournalVC = CreateJournalViewController()
    self.navigationController?.pushViewController(createJournalVC, animated: true)
}

适用情况:

  1. 按钮被按下后,"plus"会打印到控制台。

不适用情况:

  1. ViewController没有被推入。

详情:

  • 我正在使用导航控制器和选项卡控制器。
  • 我只使用编程方式,没有使用故事板。
  • 控制台没有打印错误,实际上什么也没有发生。

1
请参考以下链接以获取帮助:https://dev59.com/_1kS5IYBdhLWcg3wY11z#39929636。 - Anbu.Karthik
plusPressed 方法中检查 navigationController 是否存在。 - Rakesha Shastri
@Anbu.karthik 但是为什么我的其他项目中没有这个问题呢? - Cal
@RakeshaShastri,请您详细说明一下,抱歉,我是新手。 - Cal
在推送视图控制器的那一行设置一个断点,当执行到那里停止时,检查 navigationController 的值。 - Rakesha Shastri
显示剩余3条评论
2个回答

2
如果 TabBarController 在 NavigationController 之后,则 NavigationController 可能会变为 nil。您应该先放置 TabBarController,然后将每个与选项卡相关的 ViewController 放入自己的 NavigationController 中。
故事板:

Each Tab's ViewController gets their own NavigationController

程序化实现:
您需要像这样创建TabBarController...
window = UIWindow(frame: UIScreen.main.bounds)
let tabCon = UITabBarController()
let navCon1 = UINavigationController(rootViewController: ViewController())
let navCon2 = UINavigationController(rootViewController: CreateJournalViewController())
let navCon3 = UINavigationController(rootViewController: AnotherViewController())
tabCon.viewControllers = [navCon1, navCon2, navCon3]
tabCon.tabBar.items?[0].title = NSLocalizedString("VC", comment: "comment")
tabCon.tabBar.items?[1].title = NSLocalizedString("CJV", comment: "comment")
tabCon.tabBar.items?[2].title = NSLocalizedString("AVC", comment: "comment")
window?.rootViewController = tabCon
window?.makeKeyAndVisible()

看起来可以工作,但我无法为每个TabBarItem分配任何属性。 - Cal
您可以从以下代码中获取每个tabBarItem的数组:tabCon.tabBar.items 请参考此链接:https://dev59.com/fGox5IYBdhLWcg3w3X9S#12578423如果这对您有用,请将其标记为正确答案...谢谢 - N4SK
请确保您已经设置了所有控制器视图的backgroundColor,并且在tabCon.viewControllers数组中只添加了一个选项卡,您只添加了navCon1。虽然我在我的Mac上测试了您的代码,它似乎对我来说运行良好,每个选项卡都有标题。我会在答案中更新我的代码...如果您仍然遇到问题,可以在Stack Overflow上搜索。 - N4SK
看,你的代码可以工作。但是我无法在每个视图控制器中执行 self.title = "Home",因为这会覆盖我的选项卡栏项目的标题。 - Cal
不应该使用 self.title,而是在 viewDidLoad 方法中使用以下内容:https://dev59.com/eWEi5IYBdhLWcg3wIJJH#21615726 - N4SK
显示剩余3条评论

0

看起来 navigationControllernil,这就是为什么视图控制器没有被推送的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接