我的视图中有一个列表,一旦列表参数发生变化,它的元素就会更新。这是我的观点:
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,因此列表内容一旦在模型中发生变化就会自动更新。
我的问题是:如何捕获有关用户变量的“更新”事件?捕获后如何触发操作(例如调用函数)?
我观察到在视图中创建的对象,并且我希望具有当对象 bool 属性更改时将发生的函数。我想要类似于 .onTapGesture 的东西。有办法做到吗?是否有在该对象外部创建函数体的函数?
我有一个由几个 SwiftUI 组件组成的图形用户界面(我们称它们为子视图)。这些子视图在 ObservableObject / ObservedObject 的帮助下相互通信。当一个视图发生更改时,另一个视图会自动收到通知并自行更新。
然而,其中一个子视图不是 SwiftUI 视图,而是 SpriteKit SKScene。在这里,我也想对观察值的变化做出反应。但我没有自动更新的视图。我想根据观察到的值对精灵进行调整。
我如何得知价值的变化?我可以在 ObservedObject 的值发生变化时立即调用方法吗?
我是移动开发新手,正在学习 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) 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 文档、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.swift和ApiObjectView.swift下方。我已经发表评论指出正确的方向。
这是示例代码;
// ApiState.swift
// Stores the API state for where the request and data parse …Run Code Online (Sandbox Code Playgroud) 这个问题最好用一个例子来解释:
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) 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)
swiftui ×7
swift ×5
combine ×2
ios ×2
core-data ×1
environment ×1
function ×1
json ×1
picker ×1
sprite-kit ×1
viewbuilder ×1
xcode11 ×1