iOS:当属性为 double 时,核心数据无法保存

标签 ios swift core-data crash nsnumber

我想在我的笔记本电脑飞出窗外之前先在这里问一下。我是 iOS 开发的新手,一直在尝试使用 Core Data 来创建费用管理器应用程序。我有一个名为“Account”的实体,它有两个非可选属性(name 和 initBalance),如下所示:

enter image description here

我还创建了一个 NSManagedObject 子类,如下所示:

//Account.swift

class Account: NSManagedObject {

    override func awakeFromInsert() {
        super.awakeFromInsert()
        initBalance = NSNumber(double: 0.0)
        name = ""
    }    
}

//Account+CoreDataProperties.swift

extension Account {

    @NSManaged var initBalance: NSNumber
    @NSManaged var name: String
}

Account 实体使用 NSFetchedResultsController 在 AccountsViewController(UITableViewController 的子类,符合 NSFetchedResultsControllerDelegate 协议(protocol))中呈现。要添加一个新帐户,我使用 AccountsViewController 的 segue 将我定向到 AccountInfoViewController(如下所示),它有两个文本字段,一个用于名称,一个用于帐户余额。当后者即将消失时,将在上下文中插入一个新帐户,其名称和余额来自 textFields。一旦父 Controller 出现 (AccountsViewController),它会尝试保存更改并更新 tableView。

现在,如果我插入一个余额为整数的新帐户,那么一切都很好;上下文能够保存更改,tableView 通过显示新插入的帐户更新其行,我很高兴。当我尝试插入一个余额为十进制数的帐户时,应用程序会在上下文尝试保存更改时崩溃。关于它发生的原因,我根本没有得到任何有用的错误。这是管理文本字段的 Controller 的代码:

class AccountInfoViewController: UIViewController {

    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var balanceField: UITextField!

    var store: DataStore! // set by the parent viewController everytime this controller appears

    let numberFormatter = MyFormatter()


    // insert the new account into the context before the controller disappears
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        store.insertAccount(nameField.text!, balance: numberFormatter.numberFromString(balanceField.text!)!)
    }
}

MyFormatter 是这样的:

func MyFormatter() -> NSNumberFormatter {
    let formatter = NSNumberFormatter()
    formatter.numberStyle = .DecimalStyle
    formatter.minimumFractionDigits = 2
    formatter.maximumFractionDigits = 2
    return formatter    
}

上面显示的 DataStore 包含一个简单的核心数据堆栈,并负责插入到上下文中:

// DataStore.swift

class DataStore {

    let coreDataStack = CoreDataStack(modelName: "SmartMoney")

    // inserts a new account into the context
    func insertAccount(name: String, balance: NSNumber) -> Account {
        let account = NSEntityDescription.insertNewObjectForEntityForName("Account",
            inManagedObjectContext: coreDataStack.mainQueueContext) as! Account

        account.name = name
        account.initBalance = balance
        return account
    }
}

当 balanceField 包含非整数时,上下文无法保存更改的原因是什么?感谢您的阅读,如果您希望我发布代码的任何其他部分,请告诉我。

最佳答案

我终于弄清楚发生了什么事。将我的属性名称从 initBalance 更改为 startingBalance 使一切重新正常工作。事实上,将属性名称更改为任何不以 newinit 开头的名称都可以正常工作。我从这个post.得到了这个想法

似乎在使用 ARC 时,您的属性名称不应以单词 new 开头。事实证明,initBalance(或 newBalance)会产生同样的问题。希望它能帮助下一个遇到类似问题的可怜人。

关于iOS:当属性为 double 时,核心数据无法保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35758660/

相关文章:

ios - 将核心绘图数据线和绘图符号蒙版到背景图像

swift - 如何在 swift 3 中使用 Alamofire->4.0 映射对象

cocoa - CoreData、SourceList 和 NSTreeController

ios - 外部记录文件中 iOS Store 的核心数据

iphone - 为什么有些实体是 NSManagedObjects 而有些实体以它们的类命名?

ios - 无法为 UITableView 创建导出

ios - 在 DBAccess 中关联两个对象

uitabbarcontroller - 从 iPhone 上的 tableViewController 中确定当前选择的 TabBarItem?

ios - UICollectionView:重新加载数据,而不删除单元内动画

Swift:使用未声明的类型 'ViewController'