首页 > 解决方案 > 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()

标签: swiftswiftui

解决方案


推荐阅读