【问题标题】:How do I set an @State variable programmatically in SwiftUI如何在 SwiftUI 中以编程方式设置 @State 变量
【发布时间】:2019-10-28 17:12:57
【问题描述】:

我有一个控件,它设置一个@State 变量来跟踪自定义选项卡视图中的选定选项卡。我可以通过设置以下内容在代码中设置@State 变量:

@State var selectedTab: Int = 1

如何以编程方式设置初始值,以便在创建视图时更改选定的选项卡?

我尝试了以下方法:

1:

@State var selectedTab: Int = (parameter == true ? 1 : 2)

2:

init(default: Int) {
    self.$selectedTab = default
}

【问题讨论】:

  • 遇到同样的问题。
  • 您不应该从通过初始化程序传递的数据初始化@State 变量;由于模型是在视图之外维护的,因此无法保证该值会真正被使用。看我的回答。
  • 您应该使用 Binding 来提供对视图本地以外的状态的访问。

标签: swiftui


【解决方案1】:

我如何在我的一个视图中设置初始状态值的示例:

struct TodoListEdit: View {
    var todoList: TodoList
    @State var title = ""
    @State var color = "None"

    init(todoList: TodoList) {
        self.todoList = todoList
        self._title = State(initialValue: todoList.title ?? "")
        self._color = State(initialValue: todoList.color ?? "None")
    }

【讨论】:

    【解决方案2】:

    Joe Groff:“SwiftUI 中的@State 变量不应根据您通过初始化程序传递的数据进行初始化。正确的做法是内联设置您的初始状态值:”

    @State var selectedTab: Int = 1

    您应该使用 Binding 来提供对非本地视图状态的访问。

    @Binding var selectedTab: Int

    然后你可以从 init 初始化它,你仍然可以将它传递给子视图。

    来源:https://forums.swift.org/t/state-messing-with-initializer-flow/25276/3

    【讨论】:

    • 但是如果你有两种情况,一种是你想从前一个视图传递数据,另一种是你想用默认数据值初始化(即创建/编辑页面)?
    • 这个讨论提供了更好的上下文,说明为什么不应该像上面提到的那样初始化 @State 变量的机制:forums.swift.org/t/…
    • 你在哪里进行数据结构适配?我需要将枚举数组转换为一组字符串,以便将其传递给 List,以便用户可以选择一个或多个项目。最好的方法是使用传入的数组。所以我真的不能同意这是正确的政策。
    【解决方案3】:

    一旦我找到答案,这个问题就很容易解决了!

    您只需通过将声明更改为从初始化中删除初始值:

    @State var selectedTab: Int = 1
    

    到:

    @State var selectedTab: Int
    

    然后 selectedTab 变量自动成为实例化语句中的参数。所以初始化将是:

    TabBarContentView(selectedTab: 2)
    

    就这么简单!!!!!!

    【讨论】:

    • 如果您必须编写自己的 init,这是行不通的。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2012-06-03
    • 2011-12-20
    • 2012-09-14
    • 1970-01-01
    • 2019-11-10
    相关资源
    最近更新 更多