Swift中的复杂导航堆栈

时间:2017-06-29 21:20:25

标签: ios swift xcode uinavigationcontroller xcode-storyboard

我有一个复杂的导航问题,我希望有人可以给我一些洞察力来解决这个问题的最佳方法。我一直在使用谷歌搜索,并针对类似的问题找到了多种不同的建议,但似乎没有一个能够解决我的问题。

我有一个UITabBarController。每个选项卡都设置有自己的导航堆栈,就像应该拥有的一样。

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

此外,当在每个选项卡的根控制器上时,导航堆栈应该是它所来自的堆栈,以便它弹出到它所来自的表视图。

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

我非常希望能够处理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. 每次敲击片段时都不必重新实例化每个控制器。
  2. 能够故事板(如果没有实际的UISegmentedControlController或类似的东西可能无法实现)

1 个答案:

答案 0 :(得分:0)

我实际上找到了解决问题的正确方法。我不得不写一个自定义系统。我将回到此处并在某个时刻开展工作,以便我可以提供一个带有API的github项目,该项目将公开提供给任何人。

基本上,系统会这样做:

  • 可滚动分段控制,可根据需要扩展为多个分段。
  • A" SegmentNavigationController",这是一个UIViewController,因为它包含在点击相应段时交换,显示,(和隐藏)的视图。
    • 每个细分都有自己的导航堆栈,它只是一个视图控制器数组,用于控制当前细分中的视图。
    • 当向/从导航堆栈推送项目时,会发生自定义动画,使其看起来像是一个自然的iOS控制器。分段控件保持不变,而新视图则会动画。
    • 保留导航功能,以便在段之间切换时,您可以在点按其他段时从中断处继续。
  • 利用Clean Swift架构:http://clean-swift.com

我将此作为答案发布,因为自定义系统是最佳解决方案经过数天的审议后才会讨论。

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