swift - SwiftUI Picker 可以返回对象 ID 吗?
问题描述
我有一个费用应用程序,用户在其中创建一个 Account 对象:
@NSManaged public var id: UUID
@NSManaged public var accountName: String?
@NSManaged public var expensesAccounts: NSSet?
@NSManaged public var isCredit: Bool
然后,一旦创建,他们就会创建 Expense 对象,该对象当然会有一个相关的 Account。在费用表格中,他们从选择器中选择一个帐户:
Picker(selection: $account, label: Text("Account")) {
ForEach(accountResults) { (log: Accounts) in
Text(log.accountName ?? "No Account").tag(log.accountName)
}
}
accountResults 由这个 FetchRequest 生成:
static var accountSelection: NSFetchRequest<Accounts> {
let request: NSFetchRequest<Accounts> = Accounts.fetchRequest()
request.sortDescriptors = [NSSortDescriptor(key: "accountName", ascending: true)]
return request
}
费用实体通过 originAccounts 与 Account 实体建立关系。这是节省费用的功能。
我希望它将费用链接到现有帐户。费用Log.originAccounts 分配似乎会导致崩溃。我想也许我需要在保存 Expense 对象时创建 Accounts 的所有属性,这很好,但我不想创建新的帐户对象,我想使用现有的帐户对象。我怎样才能做到这一点?在节省费用时,我能否以某种方式从 Picker 获取 Account ID 以用作获取请求中的谓词?如果用户有多个具有相同名称的帐户(帐户可以是支票或信用),我宁愿不使用 accountName。
private func onSaveTapped() {
let expenseLog: Expenses
if let editExpense = self.editExpense {
expenseLog = editExpense
} else {
print("creating new UUID")
expenseLog = Expenses(context: self.context)
expenseLog.id = UUID()
}
print("assigning attributes...")
if self.expenseType == "One-time"{
expenseLog.expenseIsPaid = true
} else{
expenseLog.expenseIsPaid = false
}
expenseLog.expenseName = self.name
expenseLog.expenseCategory = self.category ?? ""
expenseLog.expenseCost = Double(self.amount) ?? 0
if self.expenseType != "Per Paycheck"{
expenseLog.expenseDate = beginningExpenseDay()
} else{
expenseLog.expenseDate = self.userSettings.date
}
expenseLog.originAccounts = Accounts(context: self.context)
expenseLog.originAccounts?.accountName = self.account
expenseLog.expenseAccount = self.account ?? ""
if self.expenseType == ""{
expenseLog.expenseType = "One-time"
} else{
expenseLog.expenseType = self.expenseType
}
expenseLog.shouldDupe = true
print(expenseLog)
print("Sending objectWillChange")
expenseLog.objectWillChange.send()