标签: observedobject

如何在 SwiftUI 观察到的变量更改其值时立即触发操作

我的视图中有一个列表,一旦列表参数发生变化,它的元素就会更新。这是我的观点:

struct ContentView: View {
@ObservedObject var users = Utenti()
@State private var isSharePresented: Bool = false

var body: some View {
    VStack(spacing: 20) {
        HStack(alignment: .center) {
            Spacer()
            Text("Internal Testers")
                .font(.title)
                .foregroundColor(.primary)
            Spacer()
            Button(action: {
                self.isSharePresented.toggle()
            }) {
                Image(systemName: "square.and.arrow.up").font(.title).padding(.trailing)
            }.sheet(isPresented: self.$isSharePresented, onDismiss: {
                print("Dismissed")
            }, content: {
                ActivityViewController(activityItems: self.users.listaUtenti)
            })
        }
        List(self.users.listaUtenti, id: \.self) { user in
            Text(user)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

}

视图中的用户列表

变量 users 是一个@ObservedObject,因此列表内容一旦在模型中发生变化就会自动更新。

我的问题是:如何捕获有关用户变量的“更新”事件?捕获后如何触发操作(例如调用函数)?

swiftui observedobject

4
推荐指数
1
解决办法
2386
查看次数

SwiftUI 观察对象在其属性更改时执行操作

我观察到在视图中创建的对象,并且我希望具有当对象 bool 属性更改时将发生的函数。我想要类似于 .onTapGesture 的东西。有办法做到吗?是否有在该对象外部创建函数体的函数?

function ios swift swiftui observedobject

4
推荐指数
1
解决办法
2577
查看次数

ObservedObject 更改时的通知

我有一个由几个 SwiftUI 组件组成的图形用户界面(我们称它们为子视图)。这些子视图在 ObservableObject / ObservedObject 的帮助下相互通信。当一个视图发生更改时,另一个视图会自动收到通知并自行更新。

然而,其中一个子视图不是 SwiftUI 视图,而是 SpriteKit SKScene。在这里,我也想对观察值的变化做出反应。但我没有自动更新的视图。我想根据观察到的值对精灵进行调整。

我如何得知价值的变化?我可以在 ObservedObject 的值发生变化时立即调用方法吗?

sprite-kit swift swiftui observedobject observableobject

4
推荐指数
1
解决办法
3277
查看次数

ObservedObject,派生自Json,不加载到Picker中,而是加载到List中。在 SwiftUI、Xcode 11 中

我是移动开发新手,正在学习 SwiftUI。

我一直在努力找出我的选择器出了什么问题。我成功从 URLSession 返回数据,并将其添加到我的模型中。我可以通过将 @ObservedObject 添加到列表来确认这一点,该列表返回所有项目。由于某种原因,将相同的 @ObservedObject 放入选择器会返回空选择器。任何帮助,将不胜感激。谢谢。

这是我对 Picker() 的看法。运行时,选择器为空。我可以注释掉 Picker(),只留下 ForEach() 和 Text(),然后文本就会出现。

import Foundation
import Combine
import SwiftUI

struct ContentView: View {

@ObservedObject var countries = CulturesViewModel()
@State private var selectedCountries = 0

    var body: some View {

        VStack {

            //loop through country array and add them to picker
            Picker(selection: $selectedCountries, label: Text("Select Your Country")) {
                ForEach(0 ..< countries.cultures.count, id: \.self) { post in
                    Text(self.countries.cultures[post].Culture).tag(post)
               }
            }.labelsHidden()     
        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var …
Run Code Online (Sandbox Code Playgroud)

json picker swiftui xcode11 observedobject

3
推荐指数
1
解决办法
245
查看次数

What is the difference between @StateObject and @ObservedObject in child views in swiftUI

I created a Model like this:

class TestModel: ObservableObject {
    @Published var num: Int = 0
}
Run Code Online (Sandbox Code Playgroud)

Model is be used in "Home" view and "Home"s child view "HomeSub"

struct Home: View {
    
    @StateObject var model = TestModel()
    
    var body: some View {
        NavigationView(content: {
            NavigationLink(destination: HomeSub(model: model)) { Text("\(model.num)") }
        })
    }
}
Run Code Online (Sandbox Code Playgroud)
struct HomeSub: View {
   //1
    @StateObject var model = TestModel()
   //2
    @ObservedObject var model = TestModel()

    var body: some View {
        VStack {
            Text("\(model.num)")
                .padding()
                .background(Color.red) …
Run Code Online (Sandbox Code Playgroud)

swift swiftui combine observedobject

3
推荐指数
1
解决办法
1487
查看次数

SwiftUI 自定义视图的 ViewBuilder 不会在子类 ObservedObject 更新上重新渲染/更新

我已经研究了几天,搜索了 Swift 和 SwiftUI 文档、SO、论坛等,但似乎找不到答案。

这是问题所在;

我有一个 SwiftUI 自定义视图,它对远程资源的自定义 API 请求类进行一些状态确定。View 处理显示加载状态和失败状态,以及它的主体内容通过 ViewBuilder 传递,这样如果来自 API 的状态成功并且资源数据被加载,它将显示页面的内容。

问题是,当子类 ObservedObject 更新时,ViewBuilder 内容不会重新渲染。对象更新以响应 UI(当按下按钮时等),但 UI 永远不会重新渲染/更新以反映子类 ObservedObject 内的更改,例如,子类 ObservedObject 中数组后面的 ForEach 在以下情况下不会刷新数组内容改变。如果我将它移出自定义视图,ForEach 将按预期工作。

我可以确认代码编译并运行。Observers 和debugPrint()'s 始终显示ApiObject正在正确更新状态,并且视图ApiState完全正确地反映了更改。它只是ContentViewBuilder 的。我假设是因为 ViewBuilder 只会被调用一次。

编辑:上面的段落应该是提示,ApiState更新正确,但是在将大量日志记录到应用程序之后,UI 没有监听子类 ObservedObject 的发布。属性在变化,状态也在变化,但 UI 并没有对其做出反应。另外,下一句被证明是错误的,我在 VStack 中再次测试,组件仍然没有重新渲染,这意味着我找错了地方!

如果是这种情况,VStack其他此类元素如何解决此问题?还是因为我ApiObjectView在状态更改时被重新渲染,导致子视图“重置”?尽管在这种情况下,我希望它能够接受新数据并按预期工作,但它永远不会重新渲染。

有问题的代码是在CustomDataList.swiftApiObjectView.swift下方。我已经发表评论指出正确的方向。

这是示例代码;

// ApiState.swift
// Stores the API state for where the request and data parse …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui observedobject viewbuilder

2
推荐指数
1
解决办法
3130
查看次数

在文本编辑器(文本字段输入)中输入时是否允许保存到托管对象上下文(核心数据)?

这个问题最好用一个例子来解释:

struct MyEditor: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @ObservedObject var song: Song
    
    var body: some View {
        TextEditor(text: $song.lyrics)
            .navigationTitle(song.title)
            .onChange(of: song.lyrics) { newValue in
                try? managedObjectContext.save()
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

垃圾邮件感觉不对save,但我想确保数据已存储。这是允许的并且是正确的方法吗?

我能想到的另一种方法是创建一个发布者来平滑保存信号。如果这是正确的方法。我可以从 ObservedObject 检索发布者,还是必须@State为此创建一个不同的属性并用于onChange传递值。

struct MyEditor: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @ObservedObject var song: Song
    
    @State private var lyricsPublisher = PassthroughSubject<String, Never>()
    
    var body: some View {
        TextEditor(text: $song.lyrics)
            .navigationTitle(song.title)
            .onChange(of: song.lyrics) { newValue in
                lyricsPublisher.send(newValue)
            }
            .onReceive(lyricsPublisher
                .debounce(for: 0.5, scheduler: RunLoop.main)
                .removeDuplicates()
            ) …
Run Code Online (Sandbox Code Playgroud)

core-data swiftui combine observedobject

2
推荐指数
1
解决办法
248
查看次数

如何创建符合 ObservableObject 的数组?

class Group: ObservableObject {
    @Published var size: CGFloat = 22
}

struct content: View {
    @ObservedObject var groups: [Group] = []
    var body: some view {
        .
        .
        .
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码错误信息:

在“ObservedObject”上引用初始值设定项“init(wrappedValue:)”要求“[Group]”符合“ObservableObject”

我需要符合数组,ObservableObject因为我需要检测 [Group] 中 Group 的 size 属性

如何制作数组 ObservableObject(ObservedObject)

environment swift observedobject

0
推荐指数
1
解决办法
789
查看次数