在 swiftui 视图中更改布尔值
Change boolean value inside swiftui view
我有布尔变量 (isTapped),一旦应用程序启动,我就会给它一个真值,一旦它移动到 (signupView),应用程序应该测试 if 语句中的值以显示一些文本,然后该应用程序应将 (isTapped) 的值更改为 false!!
但是没有用!! as Type () 无法确认查看。
我试图创建一个函数并在视图中调用它,但它也不起作用!
这是我的代码:
import SwiftUI
struct SignupView: View {
@AppStorage("isTapped") var isTapped : Bool?
var body: some View {
if (isTapped == true){
Text ("signup")
isTapped = false
}
else {
Text ("Splash")
}
}
}
您不能在视图层次结构中为变量设置任何内容。
所以为了实现你想做的事情,也许你可以试试这个:
var body: some View {
if (isTapped == true){
Text ("signup")
.onAppear {
isTapped = false
}
} else {
Text ("Splash")
}
}
onAppear
闭包 运行 在视图层次结构之外,因此您可以将值设置为变量。
**更新:回复:您的评论,这就是 SwiftUI 的工作方式。当在 onAppear
中设置 isTapped = false
时,SwiftUI 会立即重新加载 body 并显示启动画面。我认为要实现你所需要的,你不应该使用 @AppStorage
。它会在更新时引起 body 的更新。你为什么不像这样使用 UserDefaults
呢?:
let isTapped: Bool? = UserDefaults.standard.bool(forKey: "isTapped")
...
Text ("signup")
.onAppear {
UserDefaults.standard.set(false, forKey: "username")
}
如果您希望 Text("signup")
在 isTapped
为 True 时显示,您需要额外的变量来保持原值
struct SignupView: View {
@AppStorage("isTapped") var isTapped : Bool = false
@State var isTappedOrigin: Bool = false
var body: some View {
Group {
if (isTappedOrigin == true){
Text ("signup")
} else {
Text ("Splash")
}
}.onAppear {
isTappedOrigin = isTapped
isTapped = false
}
}
}
您需要在某处设置 isTapped = true
才能看到 Text("signup")
这样的
struct ContainView: View {
@AppStorage("isTapped") var isTapped : Bool = false
@State var show: Bool = false
var body: some View {
List {
Toggle("isTapped", isOn: $isTapped)
Button("show signup view") {
show.toggle()
}
}
.sheet(isPresented: $show) {
SignupView()
}
}
}
如果你想在启动应用程序时只显示一次signup
,应该是这样的
struct TestView: View {
@AppStorage("isSignedUp") var isSignedUp : Bool = false
@State var shouldShowSignUp : Bool = false
var body: some View {
Group {
if shouldShowSignUp {
Text("Sign Up")
} else {
Text("Splash")
}
}.onAppear {
shouldShowSignUp = !isSignedUp
isSignedUp = true
}
}
}
我有布尔变量 (isTapped),一旦应用程序启动,我就会给它一个真值,一旦它移动到 (signupView),应用程序应该测试 if 语句中的值以显示一些文本,然后该应用程序应将 (isTapped) 的值更改为 false!!
但是没有用!! as Type () 无法确认查看。 我试图创建一个函数并在视图中调用它,但它也不起作用! 这是我的代码:
import SwiftUI
struct SignupView: View {
@AppStorage("isTapped") var isTapped : Bool?
var body: some View {
if (isTapped == true){
Text ("signup")
isTapped = false
}
else {
Text ("Splash")
}
}
}
您不能在视图层次结构中为变量设置任何内容。 所以为了实现你想做的事情,也许你可以试试这个:
var body: some View {
if (isTapped == true){
Text ("signup")
.onAppear {
isTapped = false
}
} else {
Text ("Splash")
}
}
onAppear
闭包 运行 在视图层次结构之外,因此您可以将值设置为变量。
**更新:回复:您的评论,这就是 SwiftUI 的工作方式。当在 onAppear
中设置 isTapped = false
时,SwiftUI 会立即重新加载 body 并显示启动画面。我认为要实现你所需要的,你不应该使用 @AppStorage
。它会在更新时引起 body 的更新。你为什么不像这样使用 UserDefaults
呢?:
let isTapped: Bool? = UserDefaults.standard.bool(forKey: "isTapped")
...
Text ("signup")
.onAppear {
UserDefaults.standard.set(false, forKey: "username")
}
如果您希望 Text("signup")
在 isTapped
为 True 时显示,您需要额外的变量来保持原值
struct SignupView: View {
@AppStorage("isTapped") var isTapped : Bool = false
@State var isTappedOrigin: Bool = false
var body: some View {
Group {
if (isTappedOrigin == true){
Text ("signup")
} else {
Text ("Splash")
}
}.onAppear {
isTappedOrigin = isTapped
isTapped = false
}
}
}
您需要在某处设置 isTapped = true
才能看到 Text("signup")
这样的
struct ContainView: View {
@AppStorage("isTapped") var isTapped : Bool = false
@State var show: Bool = false
var body: some View {
List {
Toggle("isTapped", isOn: $isTapped)
Button("show signup view") {
show.toggle()
}
}
.sheet(isPresented: $show) {
SignupView()
}
}
}
如果你想在启动应用程序时只显示一次signup
,应该是这样的
struct TestView: View {
@AppStorage("isSignedUp") var isSignedUp : Bool = false
@State var shouldShowSignUp : Bool = false
var body: some View {
Group {
if shouldShowSignUp {
Text("Sign Up")
} else {
Text("Splash")
}
}.onAppear {
shouldShowSignUp = !isSignedUp
isSignedUp = true
}
}
}