提问人:J. Edgell 提问时间:6/14/2019 更新时间:1/1/2020 访问量:14956
如何在 SwiftUI 中以编程方式设置 @State 变量
How do I set an @State variable programmatically in SwiftUI
问:
我有一个控件,它设置一个 @State 变量来跟踪自定义选项卡视图中的选定选项卡。我可以通过设置以下内容在代码中设置 @State 变量:
@State var selectedTab: Int = 1
如何以编程方式设置初始值,以便在创建视图时更改所选选项卡?
我尝试了以下方法:
1:
@State var selectedTab: Int = (parameter == true ? 1 : 2)
2:
init(default: Int) {
self.$selectedTab = default
}
答:
-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")
}
评论