我有一个带有两个标签的标签栏。为了避免在视图控制器中使用可选参数,我尝试使用@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)
}
}
不是使用我的初始化程序,而是使用默认代码。错误消息是:
[Storyboard] Unable to find method -[(null) instantiateFirstViewControllerWithCoder:]
编辑:我将完整的演示项目上传到GitHub:demo project
答案 0 :(得分:3)
以下文章中描述的此解决方案可以与UITabBarController
和UINavigationController
配合使用。不过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)