当前的Xcode版本(10.2)有一个大问题。
有一个BasicViewController带有以下签名的类:
BasicViewController
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
然后我们有另一个像ExampleViewController: BasicViewController这样的类,它具有一些附加的逻辑。
ExampleViewController: BasicViewController
现在是棘手的部分…
我们在不同的模拟器和设备上构建和运行该应用程序,并且一切正常。然后,我们将应用程序存档,突然didSelectRow不再被解雇。对项目的彻底清理使我们能够重现该问题,而无需再次存档。
didSelectRow
我想不出什么时候会发生这种情况。而且情况变得更糟,因为我发现更多类似的问题,UITableViewDelegate即仅在运行已存档的应用程序时,才在子类中未调用方法。在归档和提交应用程序期间进行某些优化可能会出现问题吗?
UITableViewDelegate
我确认我们正确设置了表的dataSource和delegate,在表上没有手势识别器。第二次/第三次运行应用程序后,相同的逻辑运行良好,但在彻底清除项目后,第一次逻辑失败。
dataSource
delegate
我们进行了测试,UITableViewDataSource并UITableViewDelegate在子类中设置和,然后每次都能按预期运行。似乎继承协议不能很好地工作。如果我们将协议保留在父级中,并且也将其添加到子级中,则表明子级中的协议是多余的。
UITableViewDataSource
有没有人经历过类似的经历?欢迎任何建议。
您可能正在Swift 5.0编译器中遇到https://bugs.swift.org/browse/SR-10257。如果您至少有三个文件,则会发生这种情况:
BasicViewController.swift
SomeOtherFile.swift
ExampleViewController.swift
如果SomeOtherFile.swift对AnyObject-typed值进行了任何调用,则说明您是在wholemodule模式下进行编译,并且文件按上述顺序传递到编译器(SomeOtherFile.swift两者中间),那么看来编译器无法正确推断@objc-实施的意愿func tableView(_:, didSelectRowAt:)。您现在可以通过显式标记它来解决它@objc。
AnyObject
wholemodule
@objc
func tableView(_:, didSelectRowAt:)