有一个带有以下签名的BasicViewController类:
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
然后我们有另一个类,如ExampleViewController:BasicViewController,它有一些额外的逻辑.
现在是棘手的部分……
我们在不同的模拟器和设备上构建和运行应用程序,一切正常.然后我们存档应用程序,突然didSelectRow不再被解雇.深度清洁和清理项目使我们能够重现问题,而无需再次存档.
在发生这种情况时,我无法想到任何情况.而且它变得更糟,因为我发现更多类似的问题,UITableViewDelegate方法仅在运行存档应用程序时才在子类中调用.在归档和提交应用程序期间,这可能是一些优化问题吗?
我验证我们正确设置了表的dataSource和委托,表上没有手势识别器.在第二次/第三次运行应用程序后,相同的逻辑运行良好,但在深度清理项目后第一次失败.
我们做了一个测试并在子类中设置了UITableViewDataSource和UITableViewDelegate,然后每次都按预期工作.似乎继承协议不能很好地工作.如果我们将协议保留在父级中并将它们添加到子类中,那么它表示子类中的协议是冗余的.
有没有人经历过类似的事?欢迎任何建议.
您可能在Swift 5.0编译器中运行到 https://bugs.swift.org/browse/SR-10257.如果您至少有三个文件,则会发生这种情况:> BasicViewController.swift
> SomeOtherFile.swift
> ExampleViewController.swift
如果SomeOtherFile.swift对AnyObject类型的值进行任何调用,那么您将在整个模块模式下进行编译,并且文件按上述顺序传递给编译器(SomeOtherFile.swift位于两者的中间),然后似乎编译器无法正确推断@ objc-ness执行func tableView(_:,didSelectRowAt :).您现在可以通过使用@objc显式标记它来解决它.