Xcode 10.2 与 Swift 5.0 编译器 - 协议继承问题
Xcode 10.2 with Swift 5.0 compiler - protocol inheritance issue
我们当前的 Xcode 版本 (10.2) 存在一个大问题。
有一个 BasicViewController
class 具有以下签名:
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
然后我们有另一个 class,例如 ExampleViewController: BasicViewController
,它有一些额外的逻辑。
棘手的部分来了...
我们在不同的模拟器和设备上构建和 运行 应用程序,一切正常。然后我们存档应用程序,突然 didSelectRow
不再被触发。项目的深度清理和清理使我们能够重现问题而无需再次存档。
我想不出什么时候会发生这种情况。而且它变得更糟,因为我发现更多类似的问题是 UITableViewDelegate
方法仅在 运行 归档应用程序时未在子 class 中调用。归档和提交应用程序期间的某些优化是否有问题?
我确认我们正确设置了 table 的 dataSource
和 delegate
,table 上没有手势识别器。同样的逻辑在 运行 应用 second/third 次后运行良好,但在深度清理项目后第一次失败。
我们进行了测试,并在子 class 中设置了 UITableViewDataSource
和 UITableViewDelegate
,然后每次都按预期工作。似乎继承协议效果不佳。如果我们将协议保留在父级中并将它们添加到子级 class 中,那么它表示子级 class 中的协议是多余的。
有没有人经历过类似的事情?欢迎提出任何建议。
您可能会在 Swift 5.0 编译器中 运行 变成 https://bugs.swift.org/browse/SR-10257。如果您至少有三个文件,就会发生这种情况:
BasicViewController.swift
SomeOtherFile.swift
ExampleViewController.swift
如果 SomeOtherFile.swift
对 AnyObject
类型的值进行任何调用,您将在 wholemodule
模式下编译,文件将按上述顺序传递给编译器 ( SomeOtherFile.swift
在两者的中间),那么编译器似乎无法正确推断 @objc
-ness 以实现 func tableView(_:, didSelectRowAt:)
。您现在可以通过使用 @objc
明确标记它来解决它。
您应该使用 Storyboard
和 Class 附加 dataSource
和 delegate
,因为有一次我对 tableview 遇到了同样的问题,这是由于在class我还没做
self.tableView.delegate = self
self.tableView.datasource = self
我认为你不是这样做的。
我知道没有必要同时使用这两种样式,但有时我们需要这样做。看看这个答案
我运行遇到了同样的问题。我通过直接在我的主要 class 中添加方法并在其他 class 中 覆盖 它们来修复它。现在一切都被正确调用了。
我们当前的 Xcode 版本 (10.2) 存在一个大问题。
有一个 BasicViewController
class 具有以下签名:
class BasicViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
然后我们有另一个 class,例如 ExampleViewController: BasicViewController
,它有一些额外的逻辑。
棘手的部分来了...
我们在不同的模拟器和设备上构建和 运行 应用程序,一切正常。然后我们存档应用程序,突然 didSelectRow
不再被触发。项目的深度清理和清理使我们能够重现问题而无需再次存档。
我想不出什么时候会发生这种情况。而且它变得更糟,因为我发现更多类似的问题是 UITableViewDelegate
方法仅在 运行 归档应用程序时未在子 class 中调用。归档和提交应用程序期间的某些优化是否有问题?
我确认我们正确设置了 table 的 dataSource
和 delegate
,table 上没有手势识别器。同样的逻辑在 运行 应用 second/third 次后运行良好,但在深度清理项目后第一次失败。
我们进行了测试,并在子 class 中设置了 UITableViewDataSource
和 UITableViewDelegate
,然后每次都按预期工作。似乎继承协议效果不佳。如果我们将协议保留在父级中并将它们添加到子级 class 中,那么它表示子级 class 中的协议是多余的。
有没有人经历过类似的事情?欢迎提出任何建议。
您可能会在 Swift 5.0 编译器中 运行 变成 https://bugs.swift.org/browse/SR-10257。如果您至少有三个文件,就会发生这种情况:
BasicViewController.swift
SomeOtherFile.swift
ExampleViewController.swift
如果 SomeOtherFile.swift
对 AnyObject
类型的值进行任何调用,您将在 wholemodule
模式下编译,文件将按上述顺序传递给编译器 ( SomeOtherFile.swift
在两者的中间),那么编译器似乎无法正确推断 @objc
-ness 以实现 func tableView(_:, didSelectRowAt:)
。您现在可以通过使用 @objc
明确标记它来解决它。
您应该使用 Storyboard
和 Class 附加 dataSource
和 delegate
,因为有一次我对 tableview 遇到了同样的问题,这是由于在class我还没做
self.tableView.delegate = self
self.tableView.datasource = self
我认为你不是这样做的。
我知道没有必要同时使用这两种样式,但有时我们需要这样做。看看这个答案
我运行遇到了同样的问题。我通过直接在我的主要 class 中添加方法并在其他 class 中 覆盖 它们来修复它。现在一切都被正确调用了。