Swift 中的复杂导航堆栈
Complex navigation stack in Swift
我有一个复杂的导航问题,我希望有人能给我一些解决这个问题的最佳方法的见解。我一直在谷歌上搜索并找到了针对类似问题的多种不同建议,但其中 none 似乎完全解决了我的问题。
我有一个 UITabBarController。每个选项卡都设置了自己的导航堆栈,这是它应该有的。
其中一个选项卡使用具有三个段的 UISegmentedControl。这些部分中的每一个都需要有自己的视图控制器和导航堆栈,彼此独立,并且独立于选项卡栏控制器为其选项卡控制的导航堆栈。基本上,它需要像 UITabBarController 的选项卡中的 UITabBarController 一样工作,但将选项卡显示为 UISegmentedControl。
此外,当在每个选项卡的根控制器处时,导航堆栈应该是它来自的堆栈,以便它弹出到它来自的 table 视图。
我遇到了障碍,觉得无论我尝试什么,我都必须进行一些残酷的破解才能继续前进。我们将不胜感激任何帮助。
我非常希望能够在 Storyboard 中处理连接,以便让我的 Storyboard 漂亮漂亮,但如果必须在代码中完成,我也可以这样做。
编辑
我有一些解决办法。在基地 class:
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!)
}
虽然我对此并不满意。我想:
- 不必在每次点击该段时都重新实例化每个控制器。
- 能够制作故事板(没有实际的 UISegmentedController 或类似的东西可能是不可能的)
我实际上找到了解决问题的正确方法。我不得不编写一个自定义系统。我将在某个时候回过头来解决这个问题,这样我就可以提供一个 github 项目和 API 来向任何人公开提供此功能。
基本上,系统是这样做的:
- 可滚动的分段控件,可根据需要扩展到任意多个分段。
- A "SegmentNavigationController",它是一个 UIViewController,因为它包含在点击相应部分时交换、置于前面、显示(和隐藏)的视图。
- 每个段都有自己的导航堆栈,它只是控制当前段中视图的视图控制器数组。
- 在导航堆栈中推入和弹出项目 to/from 时会出现自定义动画,使其看起来像是一个自然的 iOS 控制器。分段控件保留在原位,而新视图以动画形式出现。
- 导航得以保留,因此在各段之间切换时,您可以在点击不同的段时从中断处继续。
- 利用干净的Swift架构:http://clean-swift.com
我发布这个作为答案是因为定制系统是最好的解决方案经过几天的思考之后。
这当然也是可能将此系统扩展为有用且可重复使用的东西的初步。
我有一个复杂的导航问题,我希望有人能给我一些解决这个问题的最佳方法的见解。我一直在谷歌上搜索并找到了针对类似问题的多种不同建议,但其中 none 似乎完全解决了我的问题。
我有一个 UITabBarController。每个选项卡都设置了自己的导航堆栈,这是它应该有的。
其中一个选项卡使用具有三个段的 UISegmentedControl。这些部分中的每一个都需要有自己的视图控制器和导航堆栈,彼此独立,并且独立于选项卡栏控制器为其选项卡控制的导航堆栈。基本上,它需要像 UITabBarController 的选项卡中的 UITabBarController 一样工作,但将选项卡显示为 UISegmentedControl。
此外,当在每个选项卡的根控制器处时,导航堆栈应该是它来自的堆栈,以便它弹出到它来自的 table 视图。
我遇到了障碍,觉得无论我尝试什么,我都必须进行一些残酷的破解才能继续前进。我们将不胜感激任何帮助。
我非常希望能够在 Storyboard 中处理连接,以便让我的 Storyboard 漂亮漂亮,但如果必须在代码中完成,我也可以这样做。
编辑
我有一些解决办法。在基地 class:
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!)
}
虽然我对此并不满意。我想:
- 不必在每次点击该段时都重新实例化每个控制器。
- 能够制作故事板(没有实际的 UISegmentedController 或类似的东西可能是不可能的)
我实际上找到了解决问题的正确方法。我不得不编写一个自定义系统。我将在某个时候回过头来解决这个问题,这样我就可以提供一个 github 项目和 API 来向任何人公开提供此功能。
基本上,系统是这样做的:
- 可滚动的分段控件,可根据需要扩展到任意多个分段。
- A "SegmentNavigationController",它是一个 UIViewController,因为它包含在点击相应部分时交换、置于前面、显示(和隐藏)的视图。
- 每个段都有自己的导航堆栈,它只是控制当前段中视图的视图控制器数组。
- 在导航堆栈中推入和弹出项目 to/from 时会出现自定义动画,使其看起来像是一个自然的 iOS 控制器。分段控件保留在原位,而新视图以动画形式出现。
- 导航得以保留,因此在各段之间切换时,您可以在点击不同的段时从中断处继续。
- 利用干净的Swift架构:http://clean-swift.com
我发布这个作为答案是因为定制系统是最好的解决方案经过几天的思考之后。
这当然也是可能将此系统扩展为有用且可重复使用的东西的初步。