NSArrayController NSTableView 核心数据绑定整数

Posted

技术标签:

【中文标题】NSArrayController NSTableView 核心数据绑定整数【英文标题】:NSArrayController NSTableView Core Data Binding integers 【发布时间】:2017-11-14 02:39:02 【问题描述】:

我有一个绑定到 NSArrayController 的 NSTableView,而后者又绑定到 Core Data。该表很好地显示了核心数据中的整数值,但如果我编辑表中的数字,则会出现错误:

Unacceptable type of value for attribute: property = "armorclass"; desired type = NSNumber; given type = NSTaggedPointerString; value = 10.

关于如何在数组控制器尝试将其保存回核心数据之前将此指针字符串转换回 Int16 的任何建议?

我编写了以下 ValueTransformer,但它无法正常工作。我总是收到错误:找不到名称为 StringIntegerValueTransformer 的值转换器

class StringIntegerValueTransformer: ValueTransformer 

    override class func transformedValueClass() -> AnyClass  //What do I transform
        return String.self as! AnyClass
    

    override class func allowsReverseTransformation() -> Bool  //Can I transform back?
        return false
    

    override func transformedValue(_ value: Any?) -> Any? 
        if let val = value 
            return String(describing: val)
        
        return "nil"
    

    override func reverseTransformedValue(_ value: Any?) -> Any?  //Revert transformation
        if let val = value 
            return val as? Int16
        
        return nil
    

fff

【问题讨论】:

【参考方案1】:

AppDelegate 中注册值转换器覆盖init

override init()

   let stringIntegerValueTransformer = StringIntegerValueTransformer()
   ValueTransformer.setValueTransformer(stringIntegerValueTransformer, forName:NSValueTransformerName(rawValue: "StringIntegerValueTransformer"))
   super.init()
 

并考虑文档中的此注释

您的 NSValueTransformer 子类不会自动列在 Interface Builder 绑定检查器中。检查绑定时,您可以输入值转换器注册的名称,但该功能不会出现在 Interface Builder 的测试模式中。当您的应用程序编译并运行时,将使用转换器

【讨论】:

【参考方案2】:

向文本字段添加数字格式化程序。

【讨论】:

以上是关于NSArrayController NSTableView 核心数据绑定整数的主要内容,如果未能解决你的问题,请参考以下文章

无法以编程方式将字典数组中的行添加到 NSTable

NSArrayController 的奇怪行为

NSTableView 绑定到 NSArrayController

为啥 NSArrayController 在插入对象后“失去”排序?

过滤 NSArrayController 的问题

NSArrayController 子类添加 Core Data 对象需要啥?