swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托
Posted
技术标签:
【中文标题】swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托【英文标题】:Fetched Result Controller delegate not called after swift 1.2 / xcode 6.3 update 【发布时间】:2015-04-09 10:43:24 【问题描述】:我刚刚将我的项目升级到 swift 1.2。在连续 5 或 6 次“转换为最新的 Swift”操作 :) 之后,我能够编译它。 然后我有很多我的 UI 测试失败了。这是因为我的“NSFetchedResultsControllerDelegate”不再被调用。
在(我可能会说)一次非常幸运的尝试之后,我发现这是因为我的委托不是 NSObject。所以我可以通过继承 NSObject 或添加 @obj 来修复它。
之前:
class BasicFetchedResultControllerDelegate : NSFetchedResultsControllerDelegate
之后:
class BasicFetchedResultControllerDelegate : NSObject, NSFetchedResultsControllerDelegate
我认为我在更改日志中没有看到与此相关的内容。导致这种情况的变化是什么。 您是否注意到其他类似的变化?
【问题讨论】:
【参考方案1】:我在填写错误报告后从 Apple 收到了这个:
此问题的行为与预期基于以下几点:
这是 Swift 1.2 中的一项行为更改:非 Objective-C 派生类中的方法将不再隐式标记为 @objc,即使它们与 Objective-C 协议匹配。如果您不想扩展 NSObject,可以使用 @objc 属性显式标记方法。这在 https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html#//apple_ref/doc/uid/TP40001051-CH4-SW3 的 Xcode 6.3 发行说明中有所描述。
【讨论】:
几天来我一直在想,为什么在我发现这个问题之前不调用委托方法。 Apple 应将其标记为编译错误。经验教训:不要犹豫,让 Swift 类继承 NSObject。 当我尝试在我的类中添加 NSObject 时,我得到 来自类 'UITableViewController' 和 'NSObject' 的多重继承,而添加 @objc() 声明并没有创建方法做他们应该做的。我还能尝试什么? 另一个警告,Swift 会默默地忽略泛型类中的委托方法,即使类扩展NSObject
或使用 @objc
,例如class F<T>: NSObject, NSFetchedResultsControllerDelegate
将静默失败。【参考方案2】:
Core Data 类的行为仍然非常类似于传统的 Objective-C 类。由于NSFetchedResultsController
是一个没有任何超类的@protocol
,Swift 需要明确的NSObject
声明。
您是对的,更改日志中没有任何内容。
【讨论】:
我给苹果填了一个bug,我认为'NSFecthedResultsControllerDelegate'应该扩展'NSObjectProtocol'以上是关于swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托的主要内容,如果未能解决你的问题,请参考以下文章
addAttribute 在 Swift 1.2 (Xcode 6.3) 中失败
XCode 更新到 6.3 后,“window”类型的可选性与协议“uiapplicationdelegate”所要求的不同