ios - Swift 中的复杂导航堆栈

标签 ios swift xcode uinavigationcontroller xcode-storyboard

我有一个复杂的导航问题,我希望有人能给我一些解决这个问题的最佳方法的见解。我一直在谷歌上搜索并找到了针对类似问题的多个不同建议,但似乎没有一个能完全解决我的问题。

我有一个 UITabBarController。每个选项卡都设置了自己的导航堆栈,这是应该的。

其中一个选项卡使用具有三个段的 UISegmentedControl。这些部分中的每一个都需要有自己的 View Controller 和导航堆栈,彼此独立,并且独立于选项卡栏 Controller 为其选项卡控制的导航堆栈。基本上,它需要像 UITabBarController 的选项卡中的 UITabBarController 一样工作,但将选项卡显示为 UISegmentedControl。

此外,当在每个选项卡的根 Controller 处时,导航堆栈应该是它来自的堆栈,以便它弹出到它来自的 TableView 。

我遇到了障碍,觉得无论我尝试什么,我都必须进行一些残酷的黑客攻击才能继续前进。我们将不胜感激任何帮助。

我非常希望能够在 Storyboard 中处理连接,以便让我的 Storyboard 漂亮漂亮,但如果必须用代码完成,我也可以这样做。

编辑

我有一些解决方案。在基类中:

    private func show(segment: SelectedSegment) {
    var equipmentStoryboard: UIStoryboard!
    switch segment {
    case .SelEquipment:
        equipmentStoryboard = UIStoryboard(name: "EquipmentDetailEquipmentSegment", bundle: nil)
    case .SelHistory:
        equipmentStoryboard = UIStoryboard(name: "EquipmentDetailHistorySegment", bundle: nil)
    case .SelPlans:
        equipmentStoryboard = UIStoryboard(name: "EquipmentDetailPlansSegment", bundle: nil)
    }

    if let newSegmentController = equipmentStoryboard.instantiateViewController(withIdentifier: segment.getSegmentIdentifier()) as? EquipmentDetailSegmentsViewController {
        var controllerStack = self.navigationController?.viewControllers
        controllerStack?.removeLast()
        controllerStack?.append(newSegmentController)
        self.navigationController?.setViewControllers(controllerStack!, animated: false)
    }
}
@IBAction func didTapSegmentedControl(_ sender: UISegmentedControl, forEvent event: UIEvent) {
    let newSelectedSegment = SelectedSegment(rawValue: sender.selectedSegmentIndex)

    self.show(segment: newSelectedSegment!)
}

虽然我对此并不满意。我想:

  1. 不必在每次点击该片段时都重新实例化每个 Controller 。
  2. 能够制作 Storyboard(如果没有实际的 UISegmentedControlController 或类似的东西可能是不可能的)

最佳答案

我实际上找到了解决问题的正确方法。我不得不编写一个自定义系统。我将在某个时候回过头来解决这个问题,这样我就可以提供一个带有 API 的 github 项目,向任何人公开提供此功能。

基本上,系统会这样做:

  • 可滚动的分段控件,可根据需要扩展到任意多个分段。
  • 一个“SegmentNavigationController”,它是一个 UIViewController,因为它包含在点击相应部分时被交换、带到前面、显示(和休息隐藏)的 View 。
    • 每个段都有自己的导航堆栈,它只是一组控制当前段中 View 的 View Controller 。
    • 自定义动画在将项目插入导航堆栈或从导航堆栈弹出项目时发生,以使其看起来像是一个自然的 iOS Controller 。分段控件保留在原位,而新 View 以动画形式出现。
    • 保留了导航,因此在各段之间切换时,您可以在点击不同的段时从停止的地方继续。
  • 使用 Clean Swift 架构:http://clean-swift.com

我将此作为答案发布,因为在对这个主题进行了数日的审议后,自定义系统是最佳解决方案

这当然也是可能将此系统扩展为有用和可重用的东西的初步。

关于ios - Swift 中的复杂导航堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44835176/

相关文章:

ios - iOS Simulator App无法启动

ios - 如何在 Swift 上将照片库显示为 UICollectionView 或 Assets 网格

ios - 在 Swift 中仅初始化一次 CoreData 实体

ios - 当用户输入逗号而不是点时我的应用程序崩溃了?

ios - 使用 NSNumberFormatter 生成小数点后带有尾随零的数字

xcode - AutoLayout - 按钮超出边距并且太大

ios - CALayer shouldRasterize 和 UIView drawRect?

ios - UIButton 上的操作不起作用

swift - 当当前的 SKSpriteNode 被触摸时,另一个 SKSpriteNode 会被移除

ios - IBM Worklight 6.0 - 段错误