当前位置: 首页 > 知识库问答 >
问题:

iOS Swiftui应用程序返回前景重置观察对象

艾骏喆
2023-03-14

我有一个应用程序,它使用ObservedObject在不同视图之间共享数据。

定义viewmodel

class MyViewModel: ObservableObject {
    @Published var language: String?
}

现在用于ContentView

struct ContentView: View {
    @ObservedObject private var myViewModel = MyViewModel()

    var body: some View {
        Home()
        .environmentObject(self.myViewModel)
    }
}

这里是家()

struct Home: View {
    @EnvironmentObject var myViewModel: MyViewModel

    var body: some View {
        VStack {
            Text(self.myViewModel.language ?? "")
                .onReceive(self.myViewModel.$language, perform: { language in
                    print(language)
                })
            Button(action: {
                self.myViewModel.language = "American English"
            }, label: {
                Text("Set the language")
            })
        }
    }
}

此处的onreceive用于调试目的

单击该按钮会将语言设置为“American English”,Text()将显示更新后的字符串。

现在将应用程序放在后台,然后单击图标将其调回前台:尽管UI上没有任何改变,myviewmodel是零。

为了“恢复”状态,我修改了ContentView以接收“前台通知”,如https://www.hackingwithswift.com/books/ios-swiftui/how-to-be-notifed-when-your-swiftui-app-moves-to-the-backround所建议的

struct ContentView: View {
    @ObservedObject private var myViewModel = MyViewModel()

    var body: some View {
        Home()
        .environmentObject(self.myViewModel)
        .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
           self.myViewModel.language = "American English"
        }
    }
}

Home()的onReceive中的调试打印可以工作并显示正确的字符串,但text()中的调试打印会消失,就好像它接收到的值为nil,随后没有刷新。

知道吗?

共有1个答案

苏涵润
2023-03-14

改用stateobject

struct ContentView: View {
    @StateObject private var myViewModel = MyViewModel()

...
 类似资料:
  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我已经做javascript有一段时间了。然而,我对Angular 2还比较陌生,所以我对可观测的东西几乎一无所知。当我读到对可观测事物的描述时,它们听起来很像我已经知道的回调。当我问谷歌时,有回调和promise之间的比较,也有promise和可观察之间的比较。然而,我找不到回调和可观察之间的任何比较。 回调和可观察之间有什么区别?

  • 我正在使用adal-angular4库在angular 4单页应用程序中进行隐式流实现。这个应用程序调用一个web api来显示结果。这两个应用程序都托管在azure中(在一个特定的租户中),并进行了适当的注册,配置工作正常。

  • 函数应该从get请求返回一个 在这种情况下,我只能在为真时执行请求,否则我在函数

  • 有人能告诉我为什么未定义this.userDataObserver的变量会导致.next()函数失败吗?在这里撞我的头。 我需要将一些数据推送到可以从其他组件访问的服务变量中(尽量避免使用本地存储)。 有人能帮我理解为什么这个变量在类中被明确设置时是未定义的吗? }

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用: