在MacOS应用程序(XCode 11.0稳定版,CoreData)上使用SwiftUI时,我遇到了TextFields的奇怪行为,这可能是由于我对SwiftUI数据流存在一些误解。
请考虑以下基本的“主视图/详细视图”设置:
Account
ContentView
AccountListView
AccountEditView
final class Account: NSManagedObject, Identifiable {
@NSManaged var id: UUID
@NSManaged var name: String
}
struct ContentView: View {
var body: some View {
NavigationView {
AccountListView()
.listStyle(SidebarListStyle())
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
.frame(minWidth: 300, idealWidth: nil, maxWidth: nil, minHeight: 300, idealHeight: nil, maxHeight: nil, alignment: .topLeading)
}
}
struct AccountListView: View {
@FetchRequest(entity: Account.entity(), sortDescriptors: [])
var accounts: FetchedResults<Account>
var body: some View {
VStack {
List(accounts) { account in
NavigationLink (destination: AccountEditView(account: account)) {
Text(account.name)
}
}
}
}
}
struct AccountEditView: View {
@ObservedObject var account: Account
var body: some View {
VStack {
TextField("Account Name", text: $account.name)
Spacer()
}
}
}
已正确填充视图。在列表视图中选择一个帐户可以正确更新详细信息视图中的文本字段。
但是,一旦我编辑了textfield值,事情就会变得很奇怪:
很抱歉,这个冗长的问题...
答案 0 :(得分:0)
coredata属性是另一种可选的。因此,我们需要在Model类中定义getter和setter来转换其行为。
如果您实体的代码生成不是手动/无,请在contentview中添加以下代码
extension Account {
var wrappedName: String {
get { name ?? "Unknown"}
set { name = newValue }
}
}
然后将所有account.name
替换为account.wrappedName
P.S。这已经在MacOS 10.5的XCode 11.4中进行了测试和工作