在 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
        }
    }
}