我有一个核心数据实体 string BeneficiaryName = "ABCD";
string status = "Active";
tblcell = new TableCell();
if(status == "Active")
{
tblcell.Text = BeneficiaryName + " " + status ;
}
,它与另一个实体Entry
有关系:
DataField
因为在大多数情况下使用class Entry: NSManagedObject {
//[...]
@NSManaged public var stringFields: NSSet?
}
是不切实际的,所以NSSet?
还有另一个变量:
Entry
var dataFields: [DataField] {
let arr = stringFields?.allObjects as! [DataField]
return arr.sorted(by: { $0.order < $1.order })
}
看起来像这样:
DataField
class DataField: NSManagedObject {
//[...]
@NSManaged var value: String
}
是我对整件事的包装:
EntryStore
最后,我将我的class EntryStore: NSObject, BindableObject {
private lazy var fetchedResultsController: NSFetchedResultsController<Entry> = {
//[...]
fetchedResultsController.delegate = self
return fetchedResultsController
}()
var entries: [Entry] {
return fetchedResultsController.fetchedObjects ?? []
}
let didChange = PassthroughSubject<EntryStore, Never>()
//[...]
}
extension EntryStore: NSFetchedResultsControllerDelegate {
public func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
didChange.send(self)
}
}
作为EntryStore
传递给SceneDelegate
尽管我可以将@EnvironmentObject
的其他属性与SwiftUI文本字段一起使用,但是当我尝试使用Entity
时却遇到此错误:
无法推断出通用参数'Subject'
代码:
DataField
我已经读到,此错误的一般形式是未明确键入变量的结果,但我尝试过强制转换该表达式的各种方式,但无济于事。另外,就其价值而言,当我将struct ContentView: View {
@EnvironmentObject var model: EntryStore
var body: some View {
TextField($model.entries.first!.dataFields.first!.value)
}
}
转换内联移动到TextField时,Xcode中的红线似乎在.allObjects
上:
dataFields
关于如何解决此问题的任何想法?
答案 0 :(得分:2)
问题是dataFields
的值更改时没有通知PasstrhoughSubject
-意味着它不能用作绑定。
这就是我最终的目的(对于beta 4也有一些改动)-首先给Entry
一个发布者:
public class Entry: NSManagedObject, BindableObject {
public let willChange = PassthroughSubject<Entry, Never>()
然后使用设置器和获取器来向Combine
框架发出更改警报:
var dataFields: [DataField] {
set {
willChange.send(self)
}
get {
let arr = stringFields?.allObjects as! [DataField]
return arr.sorted(by: { $0.order < $1.order })
}
}
}
现在dataFields
可用于绑定