更改 swiftui 视图内的布尔值

发布于 2025-01-12 06:08:41 字数 455 浏览 5 评论 0原文

我有布尔变量(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")
    }

}
}

I have boolean variable (isTapped), once the app is launched, I'am giving it a true value, once it moves to (signupView) the app should test the value inside if statement to show some text and after that the app should change the value of (isTapped) to false!!

But it is not working!! as Type () cannot confirm to view.
I tried to create a function and call it inside a view but it is not working either!
Here is my code:

import SwiftUI

struct SignupView: View {
@AppStorage("isTapped") var isTapped : Bool?
var body: some View {
    if (isTapped == true){
        Text ("signup")
        isTapped = false 
        
    }
    else {
        Text ("Splash")
    }

}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花开半夏魅人心 2025-01-19 06:08:41

如果您希望在 isTapped 为 True 时显示 Text("signup"),则需要额外的变量来保留原始值

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

If you want Text("signup") should be shown when isTapped is True, you need additional variable to keep the origin value

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

You need to set isTapped = true somewhere to see Text("signup") like this

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

If you want to show signup only once when launch app it should be like this

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
        }
    }
}
时光沙漏 2025-01-19 06:08:41

您无法对视图层次结构内的变量设置任何内容。
因此,为了实现您想要做的事情,也许您可​​以尝试以下操作:

var body: some View {
    if (isTapped == true){
        Text ("signup")
            .onAppear {
                isTapped = false 
            }
    } else {
        Text ("Splash")
    }
}

onAppear 闭包在视图层次结构之外运行,因此您可以将值设置为变量。

**更新:回复:您的评论,这就是 SwiftUI 的工作原理。当在 onAppear 中设置 isTapped = false 时,SwiftUI 会立即重新加载正文并显示启动画面。我认为要实现您所需要的,您不应该使用 @AppStorage。更新的时候会引起body的更新。为什么不直接使用 UserDefaults 这样呢?:

let isTapped: Bool? = UserDefaults.standard.bool(forKey: "isTapped")

...

Text ("signup")
    .onAppear {
        UserDefaults.standard.set(false, forKey: "username") 
    }

You can't set anything to a variable inside the view hierarchy.
So to achieve what you want to do, maybe you could try this:

var body: some View {
    if (isTapped == true){
        Text ("signup")
            .onAppear {
                isTapped = false 
            }
    } else {
        Text ("Splash")
    }
}

onAppear closure is run outside the view hierarchy, so you can set values to a variable.

**Update: Re: your comment, that's how SwiftUI works. When isTapped = false is set in onAppear, SwiftUI immediately reloads the body and the splash will be shown. I think to achieve what you need, you shouldn't use @AppStorage. It will cause an update of the body when it's updated. Why don't you just use UserDefaults like this?:

let isTapped: Bool? = UserDefaults.standard.bool(forKey: "isTapped")

...

Text ("signup")
    .onAppear {
        UserDefaults.standard.set(false, forKey: "username") 
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文