如何在 SwiftUI 中以编程方式设置 @State 变量

How do I set an @State variable programmatically in SwiftUI

提问人:J. Edgell 提问时间:6/14/2019 更新时间:1/1/2020 访问量:14956

问:

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

@State var selectedTab: Int = 1

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

我尝试了以下方法:

1:

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

2:

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

评论

0赞 Bagusflyer 9/10/2019
有同样的问题。
1赞 Kugutsumen 10/5/2019
您不应该从通过初始值设定项传递的数据中初始化@State变量;由于模型在视图之外进行维护,因此无法保证该值将真正被使用。看看我的答案。
0赞 Kugutsumen 10/5/2019
应使用 Binding 来提供对视图非本地状态的访问。
0赞 ConfusionTowers 5/28/2020
相关答案:stackoverflow.com/a/58137096/7106170

答:

-7赞 J. Edgell 6/18/2019 #1

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

只需将声明从以下位置更改为以下位置,即可从初始化中删除初始值:

@State var selectedTab: Int = 1

自:

@State var selectedTab: Int

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

TabBarContentView(selectedTab: 2)

就这么简单!!!!

评论

2赞 Bagusflyer 9/10/2019
如果您必须编写自己的初始化,则这是行不通的。
8赞 Kugutsumen 10/1/2019 #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

评论

1赞 Ever Uribe 4/23/2020
但是,如果您有两种情况,一种是要从前面的视图传递数据,另一种是要使用默认数据值(即创建/编辑页面)进行初始化,该怎么办?
0赞 Ever Uribe 4/23/2020
这个讨论提供了更好的背景,说明为什么不应该初始化@State变量的机制,如前所述:forums.swift.org/t/......
0赞 Todd Hoff 10/21/2021
数据结构适应在哪里?我需要将枚举数组转换为一组字符串,以便将其传递给 List,以便用户可以选择一个或多个项目。最好的方法是使用传入数组。所以我真的不能同意这是正确的政策。
33赞 stardust4891 1/1/2020 #3

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

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")
    }