swiftui - 在我的 iOS 应用中的视图之间构建导航
问题描述
随着时间的推移,通过App得到越来越复杂的形状。
在某些情况下,应用流程可能是:
查看 A -> 查看 B -> C -> D 然后返回 D -> C -> B -> A..
但有时我需要跳过视图并转到 D -> B -> A..
在某些情况下,它的 A -> C -> D 然后是 D -> A
我开始使用 NavigationView/NavigationLink,在某些情况下我使用以下方法:
let weekView = WeekView(journey: journey, isRoot: isRoot).environmentObject(self.thisSession)
window?.rootViewController = UIHostingController(rootView: weekView)
不,我意识到它已经变得一团糟..是时候让我重新考虑一下了..
您如何处理应用程序中的导航,这些导航不能总是通过从导航堆栈中推送/弹出视图来完成?
解决方案
在这里使用 ViewBuilders 是一个不错的选择。
@ViewBuilder func myViewRouter(selection: Selection) -> some View {
switch selection {
case selection1:
View1()
case selection2:
View2()
case selection3:
View3()
}
}
enum Selection { ... }
ViewBuilders 很强大,它几乎是一个可以返回不透明类型的函数,但请注意缺少 return 关键字。这似乎是一个完美的用例。在示例中,我使用了枚举,但在父视图上使用 var selection = 0 并将 ViewBuilder 作为子视图也很常见。无论哪种方式,相同的功能。
以下是了解 ViewBuilders 的好网址。
https://swiftwithmajid.com/2019/12/18/the-power-of-viewbuilder-in-swiftui/
最后编辑:这是一个示例用例:
import SwiftUI
struct ContentView: View {
@State private var selection: SelectionEnum = .zero
var body: some View {
VStack {
showMyViews(selection: selection)
HStack {
ForEach(SelectionEnum.allCases, id: \.self) { selection in
Button(action: {self.selection = selection}){
Text(selection.rawValue)
.fontWeight(.bold)
.frame(width: 60, height: 60)
.foregroundColor(.white)
.background(Color.blue)
.cornerRadius(10)
}
}
}
}
}
@ViewBuilder func showMyViews(selection: SelectionEnum) -> some View {
switch selection {
case .zero:
ViewA()
case .one:
ViewB()
case .two:
ViewC()
case .three:
ViewD()
}
}
enum SelectionEnum: String, CaseIterable {
case zero
case one
case two
case three
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
struct ViewA: View {
var body: some View {
Text("View A")
}
}
struct ViewB: View {
var body: some View {
Text("View B")
}
}
struct ViewC: View {
var body: some View {
Text("View C")
}
}
struct ViewD: View {
var body: some View {
Text("View D")
}
}
推荐阅读
- django - DRF如何在序列化器CharField中允许列表
- oracle - dbms_transaction.local_transaction_id 是否重复值?
- python - 如何在Python中按升序压缩递增的整数序列
- flutter - Flutter CheckBox issue
- python - 如何在谷歌云上运行生产中的某些代码行?
- javascript - NodeJS:如何创建一个唯一的出站电子邮件传递系统?
- android - 我在 React-Native 中遇到错误,无法从 `? 解析模块`./http://localhost:8081/index`
- python - 使用 python 比较 2 列,从第 3 列中找到 col1 和 col2 相同值的最大值,并将其作为新的第 3 列输出
- c# - 我应该如何在 Monogame 中制作光标视差效果?
- android - Android WebRTC:从新的 getStats() API 消费数据的标准方式是什么