【问题标题】:How can an NSManagedObject conform to the NSItemProviderReading protocol?NSManagedObject 如何符合 NSItemProviderReading 协议?
【发布时间】:2017-07-31 23:49:36
【问题描述】:

创建核心数据实体的NSManagedObject 子类后,如何使其正确符合NSItemProviderReading 协议?该协议有一个必需的初始化程序,必须直接在类中声明。但是NSItemProviderReadinginit(itemProviderData:, typeIdentifier:) 应该调用哪个指定的初始化程序?

这是我下面的内容:

import Foundation
import CoreData

@objc(Something)
public class Something: NSManagedObject, NSItemProviderReading {

    public override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?) {
        super.init(entity: entity, insertInto: context)
    }

    // MARK: - Item Provider Reading 

    public static var readableTypeIdentifiersForItemProvider: [String] {
        return []
    }

    public required init(itemProviderData data: Data, typeIdentifier: String) throws {
        // This seems very hack-y…
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        self.init(context: context)
    }
}

拨打self.init(context:)真的是去这里的正确方式吗?

【问题讨论】:

    标签: swift core-data drag-and-drop ios11 swift4


    【解决方案1】:

    要符合NSItemProviderReading 协议,需要符合您提到的init 以及静态变量readableTypeIdentifiersForItemProvider

    init(itemProviderData: Data, typeIdentifier: String)
    
    static var readableTypeIdentifiersForItemProvider: [String]
    

    documentation必填 注释表示这一点。

    我看不出你的init 有什么问题,所以如果它编译并按照你计划使用该类的方式工作,我看不出有问题。我建议使用依赖注入将核心数据上下文传递到整个应用程序中,并传递给需要它们的视图控制器。这样您就不必每次都编写烦人的AppDelegate 代码(而且更安全,因为您可以确保上下文始终可用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多