ios - 在处理关系 Segue 时,iOS 8 的 "Storyboard Reference"的替代方案?

标签 ios swift uitabbarcontroller storyboard-reference

我的应用程序有一个包含 4 个选项卡的 TabBarViewController。其中一个选项卡是“设置”,我想将其移至单独的 Storyboard。如果我只考虑 iOS 9 及更高版本作为我的部署目标,那么我可以使用 Storyboard Reference 重构 SettingsTab。但是我也想针对 iOS 8。由于 Storyboard Reference 不支持 Relationship Segue,因此在这种情况下我不能依赖它。

所以在包含 TabBarViewController 的主 Storyboard 中,我保留了一个虚拟的 SettingsTabViewController 作为空占位符。在其类文件中的函数 "viewWillAppear" 中,我将 View 推送到 Settings.storyboard 中的真实 SettingsTabViewController。这很好用。但问题是,如果我继续点击“设置”选项卡,空的占位符 View Controller 将显示一小段时间,然后返回到真正的“设置” View 。

我试图实现这个委托(delegate)来锁定“设置”选项卡:

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {

      return viewController != tabBarController.selectedViewController

}

但是,在我实现这个委托(delegate)之后,其他三个选项卡也被锁定了。

是否可以只锁定“设置”选项卡而不锁定其他三个选项卡?我到底应该在哪个 View Controller 中实现这个委托(delegate)?

最佳答案

是的,这是可能的。您需要检查索引; 使用以下代码,您不仅可以防止锁定其他选项卡,而且您仍然具有 tap on tab goto root view controller 功能。

func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
    let tappedTabIndex = viewControllers?.indexOf(viewController)
    let settingsTabIndex = 3 //change the index
    if tappedTabIndex == settingsTabIndex && selectedIndex == settingsTabIndex {
        guard let navVC = viewController as? UINavigationController else { return true }
        guard navVC.viewControllers.count > 1 else { return true }

        let firstRealVC = navVC.viewControllers[1]
        navVC.popToViewController(firstRealVC, animated: true)
        return false
    }
    return true
}

.

这回答了你的问题,但你仍然会看到 settingsVC 片刻。为避免这种情况,您只需在插入动画时关闭动画即可。因此您需要按以下方式覆盖 viewWillAppear

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if let theVC = storyboard?.instantiateViewControllerWithIdentifier("theVC") {
        navigationController?.pushViewController(theVC, animated: false)
    }
}

添加以上代码后,您仍然会在真正的第一个 viewController 中看到一个后退按钮。你可以隐藏它:

override func viewDidLoad() {
    super.viewDidLoad()
    navigationItem.hidesBackButton = true
}

关于ios - 在处理关系 Segue 时,iOS 8 的 "Storyboard Reference"的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378120/

相关文章:

iphone - stretchableImageWithLeftCapWidth 导致角落模糊

ios - fatal error : unexpectedly found nil while unwrapping an Optional value in inheriting class

ios - 如何在 UIviewcontroller 上使用 UItabbar?

ios: 仅设置标签栏顶部边框

ios - 如何从另一个 View 设置 ImageView 图像

iphone - iPhone 上运行 App 的声音太小

html - 将 HTML 页面转换为 iOS View

swift - 使用 Swift 注册 Firebase

swift - 在 Swift 3 中通过下标访问 NSCache

c++ - 将 C++ 代码桥接到我的 swift 代码中。 XCode 中哪种文件扩展名适用于哪种基于 c 的语言?