如何在UITabBarController中使用@IBSegueAction?

时间:2019-11-14 00:30:48

标签: uistoryboard ios13 xcode11 swift5.1 ibsegueaction

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

tab bar with two tabs

我通过以下方式初始化标签栏控制器:

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)
    }
}

我将segue连接到相应的@SegueAction@SegueAction setup

我的问题是,当我运行项目时,出现此崩溃: Fatal error

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

编辑:我将完整的演示项目上传到GitHub:demo project

3 个答案:

答案 0 :(得分:3)

以下文章中描述的此解决方案可以与UITabBarControllerUINavigationController配合使用。不过UISplitViewController不能。

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

简而言之:

  • 使用容器视图创建根UIViewController(例如RootViewController
  • 设置从容器视图转到UITabBarController的嵌入序列
  • @IBSegueAction中实现RootViewController,例如
@IBSegueAction
func makeFirstViewController(coder: NSCoder) -> UIViewController? { ... }
  • 对于从UITabBarController到其viewController的segue,将segue动作连接到RootViewController

答案 1 :(得分:1)

我一直在努力解决这个错误(是的,我觉得这是Apple的错误)已经一个多月了。我只在情节提要板中创建了viewControllers来绕过它(在这种情况下,我可以使用我的参数.instantiateInitialViewController)。对于tabBarController,我以编程方式创建它,并在代码中将实例化的viewControllers附加到它。

答案 2 :(得分:0)

您需要在segue的Attribute Inspector中设置segue的标识符(它与ContainerView的嵌入式segue一起使用,但我认为其他Segues也是相同的): enter image description here