Swift中的复杂导航堆栈



我有一个复杂的导航问题,我希望有人可以让我了解解决此问题的最佳方法。我一直在谷歌搜索,并且已经为类似问题找到了多种不同的建议,但是它们似乎都没有解决我的问题。

我有一个UitabbarController。每个选项卡都设置为其自己的导航堆栈,如它。

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

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

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

我非常宁愿能够处理情节板中的连接,以使我的故事板保持良好而漂亮,但是如果必须在代码中完成,我也可以做到。

编辑

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

    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. 能够讲故事(如果没有实际的Uiseedcontrolcontroller或类似的东西,可能是不可能的(

我实际上找到了正确的解决方案。我必须编写一个自定义系统。我将在某个时候回到这一点,并在某个时候对此进行努力,以便我可以为API提供一个可以为任何人提供该功能的API。

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

  • 可根据需要扩展到尽可能多的段的可滚动分段控制。
  • 一个"分段范围",它是一个UiviewController,因为它包含在攻击各个段时交换为前面的视图,将其换到前面,显示为(和休息(。
    • 每个段都有其自己的导航堆栈,这只是视图控制器的数组,可控制当前段中的视图。
    • 自定义动画发生在推送和从导航堆栈中推出的物品时进行,以使其看起来是天然iOS控制器。分段控件保持原处,而新视图则在。
    • 中。
    • 导航被保留,因此在段之间切换时,您可以在敲击其他段时恢复到关闭的位置。
  • 使用干净的Swift体系结构:http://clean-swift.com

我将此作为答案,因为经过几天的审议后,自定义系统是最好的解决方案

这当然也是将此系统扩展到有用和可重复使用的一些初步。

最新更新