4

我有一个带有两个标签的标签栏。为了避免在视图控制器中有选项,我尝试使用@IBSegueAction.

带有两个选项卡的选项卡栏

我初始化标签栏控制器:

let tabBarController = storyboard.instantiateInitialViewController { coder in
    TabBarController(coder: coder, mainVar: (first: "Hello", second: "World"))
}

我从标签栏控制器类初始化两个视图控制器:

class TabBarController: UITabBarController {

    let mainVar: (first: String, second: String)

    required init?(coder: NSCoder) {
        fatalError()
    }

    init?(coder: NSCoder, mainVar: (String, String)) {
        self.mainVar = mainVar
        super.init(coder: coder)
    }

    @IBSegueAction func instantiateFirstViewController(coder: NSCoder) -> UIViewController? {
        FirstViewController(coder: coder, firstVar: mainVar.first)
    }

    @IBSegueAction func instantiateSecondViewController(coder: NSCoder) -> UIViewController? {
        SecondViewController(coder: coder, secondVar: mainVar.second)
    }
}

这是视图控制器之一:

class FirstViewController: UIViewController {

    let firstVar: String

    required init?(coder: NSCoder) {
        fatalError()
    }

    init?(coder: NSCoder, firstVar: String) {
        self.firstVar = firstVar
        super.init(coder: coder)
    }
}

我将segues连接到相应@SegueAction的s: @SegueAction 设置

我的问题是,当我运行项目时,我遇到了这个崩溃: 致命错误

而不是使用我的初始化程序 Xcode 是使用默认的。错误信息是: [Storyboard] Unable to find method -[(null) instantiateFirstViewControllerWithCoder:]

编辑:我在 GitHub 上上传了完整的演示项目:演示项目

4

3 回答 3

3

以下文章中描述的此解决方案适用于UITabBarControllerUINavigationControllerUISplitViewController虽然不是。

https://useyourloaf.com/blog/using-ibsegueaction-with-tab-bar-controllers/

简而言之:

  • 用容器视图创建一个根UIViewController(比如)RootViewController
  • 设置一个从容器视图到你的嵌入 segueUITabBarController
  • 在eg中实现@IBSegueActionsRootViewController
@IBSegueAction
func makeFirstViewController(coder: NSCoder) -> UIViewController? { ... }
  • 对于从UITabBarController到其 viewControllers 的 segue,将 segue 操作连接到RootViewController
于 2020-05-27T19:40:41.690 回答
1

一个多月以来,我一直在努力解决这个错误(是的,我认为这是 Apple 的错误)。我通过在 Storyboards 中只创建 viewControllers 来绕过它(在这种情况下,我可以使用我的参数 .instantiateInitialViewController)。至于 tabBarController,我以编程方式创建它,在代码中将实例化的 viewControllers 附加到它。

于 2019-11-19T06:05:13.767 回答
0

您需要在 segue 的 Attribute Inspector 中为 segue 设置一个标识符(它与 ContainerView 的嵌入式 segue 一起使用,但我认为其他 segue 也是如此): 在此处输入图像描述

于 2020-03-25T00:47:20.543 回答