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

J. *_*ell 10 swiftui

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

@State var selectedTab: Int = 1
Run Code Online (Sandbox Code Playgroud)

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

我尝试了以下方法:

1:

@State var selectedTab: Int = (parameter == true ? 1 : 2)
Run Code Online (Sandbox Code Playgroud)

2:

init(default: Int) {
    self.$selectedTab = default
}
Run Code Online (Sandbox Code Playgroud)

kej*_*ion 25

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

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")
    }
Run Code Online (Sandbox Code Playgroud)


Kug*_*men 5

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

@State var selectedTab: Int = 1

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

@Binding var selectedTab: Int

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

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


J. *_*ell -7

一旦我找到答案,解决这个问题就变得非常简单!

您只需通过更改以下声明来从初始化中删除初始值:

@State var selectedTab: Int = 1
Run Code Online (Sandbox Code Playgroud)

到:

@State var selectedTab: Int
Run Code Online (Sandbox Code Playgroud)

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

TabBarContentView(selectedTab: 2)
Run Code Online (Sandbox Code Playgroud)

就这么简单!!!!

  • 如果您必须编写自己的 init,这是行不通的。 (2认同)