【问题标题】:SwiftUI State Variable not Rendering View Unless Used Inside View (verses in modifier)SwiftUI 状态变量不渲染视图,除非在视图内部使用(修改器中的诗句)
【发布时间】:2020-08-31 05:35:11
【问题描述】:

抱歉措辞糟糕,但在 onAppear 中我正在更改状态变量,但是除非我在视图内的某处使用该状态变量,否则这不会重新渲染视图。

如果用户未登录,我会尝试弹出一个模式,但除非我将变量放入视图中,否则它不会弹出,如下所示

struct SearchView: View {
// Environment Variables
@EnvironmentObject var session: SessionStore

@State var sheetIsPresented: Bool = false

var body: some View {
    NavigationView {
        // Just having a line like this will cause it to work
        if self.sheetIsPresented || !self.sheetIsPresented {}
    }
    .onAppear {
        if self.session.userSession != nil {
            self.sheetIsPresented = true
        }
    }
    .sheet(isPresented: $sheetIsPresented) {
        WelcomeSignInModal(sheetIsPresented: self.$sheetIsPresented)
    }
}
}

【问题讨论】:

  • 在这里工作正常。你确定self.session.userSession != nil这个条件在你测试的那一刻是真的吗?
  • @Asperi 是的。断点被击中,如果我在正文中输入 Text("(sheetIsPresented)") ,它将显示为 true 并弹出模式。
  • 这里有同样的问题

标签: swiftui state swiftui-state


【解决方案1】:

您可以尝试以下演示:

class SessionStore: ObservableObject {
    var userSession: String? = "session"
}

struct ContentView: View {
    @EnvironmentObject var session: SessionStore

    @State var sheetIsPresented: Bool = false

    var body: some View {
        NavigationView {
            Text("SearchView")
        }
        .onAppear {
            self.sheetIsPresented = self.session.userSession != nil
        }
        .sheet(isPresented: $sheetIsPresented) {
            Text("WelcomeSignInModal")
        }
    }
}

使用 Xcode 11.6、iOS 13.6 测试

【讨论】:

  • 在 Xcode 11.6 和 iOS 13.6.1 上仍然不适合我。要求我包括无用的行。必须与我获取 userSession 的方式有关
  • @connorvo 上面的代码与模拟的 SessionStore 一起工作,也许发布一个最小的、可重现的 actual SessionStore 版本?
猜你喜欢
  • 2020-12-16
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2021-02-05
  • 2013-04-26
  • 2020-08-23
  • 1970-01-01
相关资源
最近更新 更多