iOS:当属性为double时,Core Data无法保存

时间:2016-03-02 21:41:28

标签: ios swift core-data crash nsnumber

在我将笔记本电脑飞出窗外之前,我想我先问到这里。我是iOS开发的新手,并且一直在努力创建一个费用管理器应用程序。我有一个名为“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
}

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

现在,如果我插入一个余额是整数的新帐户,那么生活是美好的;上下文能够保存更改,tableView通过显示新插入的帐户更新其行,我很高兴。当我尝试插入余额为十进制数的帐户时,应用程序在上下文尝试保存更改时崩溃。我没有得到任何有用的错误,为什么会发生。以下是管理textFields的控制器的代码:

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包含一个简单的Core Data Stack,负责插入上下文:

// 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包含非整数时,上下文是否无法保存更改?感谢您阅读,如果您希望我发布代码的任何其他部分,请告诉我。

1 个答案:

答案 0 :(得分:4)

我终于弄明白了发生了什么。将我的属性名称从initBalance更改为startingBalance会使所有内容再次发挥作用。实际上,将属性的名称更改为不以newinit开头的任何内容都可以正常工作。我从这个post.

中得到了这个想法

似乎在使用ARC时,您的媒体资源名称不应以new开头。事实证明,initBalance(或newBalance就此而言)会产生同样的问题。希望它可以帮助下一个可怜的灵魂在类似的问题中运行。