我有一个带有两个选项卡的选项卡栏。为了避免在 View Controller 中使用可选项,我正在尝试使用 @IBSegueAction
。
我初始化标签栏 Controller :
let tabBarController = storyboard.instantiateInitialViewController { coder in
TabBarController(coder: coder, mainVar: (first: "Hello", second: "World"))
}
我从选项卡栏 Controller 类初始化两个 View Controller :
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)
}
}
这是其中一个 View Controller :
class FirstViewController: UIViewController {
let firstVar: String
required init?(coder: NSCoder) {
fatalError()
}
init?(coder: NSCoder, firstVar: String) {
self.firstVar = firstVar
super.init(coder: coder)
}
}
Xcode 没有使用我的初始化程序,而是使用默认的初始化程序。错误信息是:
[ Storyboard] 无法找到方法 -[(null) instantiateFirstViewControllerWithCoder:]
编辑:我在 GitHub 上上传了完整的演示项目:demo project
最佳答案
以下文章中描述的解决方案适用于 UITabBarController
和 UINavigationController
。不过 UISplitViewController
不行。
https://useyourloaf.com/blog/using-ibsegueaction-with-tab-bar-controllers/
简而言之:
- 创建一个带有容器 View 的根
UIViewController
(比如RootViewController
) - 设置从容器 View 到您的
UITabBarController
的嵌入转场
- 在
RootViewController
中实现@IBSegueAction
,例如
@IBSegueAction
func makeFirstViewController(coder: NSCoder) -> UIViewController? { ... }
- 对于从
UITabBarController
到它的 viewController 的转场,将转场 Action 连接到RootViewController
关于uistoryboard - 如何在 UITabBarController 中使用@IBSegueAction?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847674/