首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI清理ContentView

SwiftUI清理ContentView
EN

Stack Overflow用户
提问于 2022-02-11 08:50:09
回答 2查看 104关注 0票数 0

我试图在项目中简化ContentView,并且我很难理解如何将基于@State的逻辑迁移到自己的文件中,并让ContentView适应任何更改。目前,我有基于@Binding操作显示自己的动态视图,我将$binding传递到视图层次结构中,以使按钮切换bool值。

这是我目前的尝试。我不知道在SwiftUI中如何在不通过视图堆栈传递SheetPresenter的情况下,从嵌套视图中更改SheetPresenter的视图状态。理想情况下,我希望它看起来像ContentView.overlay(sheetPresenter($isOpen, $present)

另外,我正在学习SwiftUI,如果这不是最好的方法,请提供指导。

代码语言:javascript
复制
class SheetPresenter: ObservableObject {

@Published var present: Present = .none
@State var isOpen: Bool = false

enum Present {
    case none, login, register
}

@ViewBuilder
func makeView(with presenter: Present) -> some View {
    switch presenter {
    case .none:
        EmptyView()
    case .login:
        BottomSheetView(isOpen: $isOpen, maxHeight: UIConfig.Utils.screenHeight * 0.75) {
            LoginScreen()
        }
    case .register:
        BottomSheetView(isOpen: $isOpen, maxHeight: UIConfig.Utils.screenHeight * 0.75) {
            RegisterScreen()
        }
    }
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-11 09:22:31

如果您不想在视图下传递$binding,您可以在顶部视图中创建一个StateObject变量,并使用.environmentObject()传递它。并使用EnvironmentObject从任何视图访问它。

代码语言:javascript
复制
struct testApp: App {
        @StateObject var s1:  sViewModel = sViewModel()
        var body: some Scene {
            WindowGroup {
                ContentView()               
                    .environmentObject(s1)
            }
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2022-02-11 23:01:54

你是对的,这不是最好的方法,但这是一个常见的错误。在SwiftUI中,我们实际上对视图拥有的瞬态数据使用@State。这意味着使用类似于struct的值类型,而不是类。这是解释在4:18在2020年SwiftUI中的数据要点

EditorConfig可以对其性质保持不变量,并可独立测试。由于EditorConfig是一种值类型,所以对EditorConfig属性的任何更改,就像其进度一样,都可以作为对EditorConfig本身的更改而可见。

代码语言:javascript
复制
struct EditorConfig {
    var isEditorPresented = false
    var note = ""
    var progress: Double = 0
    mutating func present(initialProgress: Double) {
        progress = initialProgress
        note = ""
        isEditorPresented = true
    }
}
struct BookView: View {
    @State private var editorConfig = EditorConfig()
    func presentEditor() { editorConfig.present(…) }
    var body: some View {
        …
        Button(action: presentEditor) { … }
        …
    }
}

然后,您只需使用$editorConfig.isEditorPresented作为.sheet.overlay中的布尔绑定。

同样值得一看的是单张(项目:无遗漏:内容:),它使显示项变得更加简单,因为不需要布尔值,它使用一个可选的@State,您可以将其设置为零来拒绝。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71077321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档