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 项目更新到 Xcode 到 6.3 后显示错误

XCode 更新到 6.3 后,“window”类型的可选性与协议“uiapplicationdelegate”所要求的不同

UITableViewAutomaticDimension 在 Xcode 6.3 中不起作用

归档应用程序时 XCode 6.3 崩溃

如何在 Swift(Xcode 6.3)中翻转标签(获取镜像视图)