我遇到了一个复杂的导航问题,希望有人可以让我对解决此问题的最佳方法有所了解。我一直在使用Google搜索,发现了针对类似问题的多种不同建议,但似乎都没有一个能解决我的问题。

我有一个UITabBarController。每个选项卡均应具有自己的导航堆栈。

这些选项卡之一使用带有三个段的UISegmentedControl。这些段中的每一个都需要具有自己的视图控制器和导航堆栈,彼此独立并且与选项卡栏控制器为其选项卡控制的导航堆栈无关。基本上,它需要像UITabBarController的选项卡中的UITabBarController一样工作,但是将这些选项卡显示为UISegmentedControl。

同样,当在每个选项卡的根控制器处时,导航堆栈应该是其来源所在的堆栈,以便将其弹出到其来源所在的表视图中。

我遇到了麻烦,无论我如何尝试,都觉得我必须要有一些残酷的技巧才能继续前进。任何帮助都将不胜感激。

我强烈希望能够处理情节提要中的连接,以使我的情节提要保持美观,但如果必须在代码中完成,我也可以这样做。

编辑

我有解决办法。在基类中:

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

我对此并不满意。我想:
  • 不必在每次点击该段时重新实例化每个控制器。
  • 能够对其进行情节提要(如果没有实际的UISegmentedControlController或类似的东西,可能无法实现)
  • 最佳答案

    我实际上找到了解决该问题的正确方法。我必须编写一个自定义系统。我将回到这一点并在某个时候进行研究,以便我可以为GitHub项目提供API,该API可以向所有人公开提供此功能。

    基本上,系统执行此操作:

  • 可滚动分段控件,可以根据需要扩展到任意多个分段。
  • 一个“SegmentNavigationController”,它是一个UIViewController,因为它包含的视图在点击相应的段时会被交换,显示在前面,显示在其中(并保持隐藏)。
  • 每个段都有其自己的导航堆栈,该堆栈只是用于控制当前段中视图的视图控制器的数组。
  • 将项目推入/从导航堆栈弹出时,会发生自定义动画,以使其看起来像是自然的iOS控制器。分割的控件保留在原处,而新视图则以动画形式显示。
  • 保留导航,以便在各段之间切换时,可以在点击其他段时从中断处继续。
  • 利用Clean Swift体系结构:http://clean-swift.com

  • 我将其发布为答案,因为经过数天的讨论,定制系统是最佳解决方案

    当然,这也是可能将该系统扩展到有用和可重用的基础。

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

    10-14 14:30
    查看更多