【问题标题】:SWIFTUI Binding Not UpdatingSWIFTUI 绑定未更新
【发布时间】:2021-12-06 00:45:05
【问题描述】:

我有一个带有“登录”按钮的主屏幕。单击该按钮,它将弹出一个登录屏幕。登录后,弹出屏幕将被关闭。主屏幕会显示“登录!”我有一个@State boolean var 监控按钮单击,另一个@EnvironmentObject 观察登录状态。如果登录成功,isAnon=false。然后弹出窗口将被关闭。但它现在不起作用。成功登录后,弹出屏幕仍然亮着。我怀疑声明 Binding<Bool>()isAnon=false 时不会更新。这可能吗 ?我错过了哪里?非常感谢!这是代码

    @EnvironmentObject var session: SessionStore
    @State var isSignInClicked: Bool = false
    
    var body: some View {
        if session.isAnon{// if it is anonymous
            Button("Please Sign in to view your activities") {
                isSignInClicked.toggle()
            }
            .popover(isPresented: Binding<Bool>( get: { session.isAnon && isSignInClicked},set: {_ in })){
                LogInView()
            }
        }
        else{// if it's logged in
            Text("Logged In!")
        }
    }
}

【问题讨论】:

  • 我假设您的 isAnon 属性是可计算的 - 这可能是原因,改为存储已发布的属性。
  • isAnon@Published

标签: swiftui binding popover


【解决方案1】:

正如@Asperi 提到的,使用@Published 表示isAnon。这对我很有效。 这是我的测试代码:

import SwiftUI

@main
struct TestApp: App {
    @StateObject var session = SessionStore()
    var body: some Scene {
        WindowGroup {
            HomeView().environmentObject(session)
        }
    }
}  
    
class SessionStore: ObservableObject {
    @Published var isAnon = true
}

struct HomeView: View {
    @EnvironmentObject var session: SessionStore
    @State var isSignInClicked: Bool = false
    
    var body: some View {
        if session.isAnon {// if it is anonymous
            Button("Please Sign in to view your activities") {
                isSignInClicked.toggle()
            }
            .popover(isPresented: Binding<Bool>( get: { session.isAnon && isSignInClicked},set: {_ in })){
                LogInView()
            }
        }
        else {// if it's logged in
            Text("Logged In!")
        }
    }
} 

EDIT1:包括缺失的测试LoginView

struct LogInView: View {
    @EnvironmentObject var session: SessionStore
    
    var body: some View {
        Text("LogInView here")
            .onDisappear {
                session.isAnon = false
            }
        // alternative using a button
        //        Button("LogInView click me") {
        //            session.isAnon = false
        //        }
    }
}

  

【讨论】:

  • 感谢@workingdog。但是我的isAnon 的定义方式和你一样。问题是,弹出框不会关闭。在您的代码中,弹出框将如何被解除? isAnon 不会改变,对吧?在我的代码中,当登录成功时,isAnon 设置为false,这应该会关闭弹出框。登录后我打印出isAnon 的值。它确实更改为false。但是,我不知道如何打印出Binding&lt;Bool&gt; ()的值
  • 现在我的猜测是,因为Button 也由session.isAnon 控制。当session.isAnon 设置为false 时,SWIFTUI 首先销毁Button。由于弹出框附加到Button,因此命令链就会丢失。这可能吗?
  • 我只是删除了if session.isAnon,弹出框按预期被取消了。实现此方案的任何建议:单击主页上的按钮以显示登录窗口;登录完成后,登录窗口消失,首页显示新内容。
  • 抱歉,我忘记包含我的测试LogInView。用它更新了我的答案。如果这对您不起作用,请告诉我。
猜你喜欢
  • 2020-04-04
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多