如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?
Posted
技术标签:
【中文标题】如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?【英文标题】:How to avoid using @objc with a refresh control in iOS 11 with Swift 4? 【发布时间】:2017-10-08 02:06:04 【问题描述】:我将我的项目从 Swift 3 升级到 Swift 4,并在迁移过程中在我的代码中插入了一堆“@objc”注释。我希望摆脱它们以避免生成任何 Objective-C 入口点。我不知道如何摆脱的其中之一是使用刷新控件。这是有问题的代码:
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(MyController.handleRefresh(refreshControl:)), for: .valueChanged)
self.table.refreshControl = refreshControl;
问题似乎是#selector 的使用。如何在没有选择器的情况下实现刷新控件?
【问题讨论】:
你可以尝试使用类型别名吗? 避免生成任何 Objective-C 入口点为什么这对你很重要? @Caleb 我的主要原因是我想编写干净、漂亮的 Swift-4 代码,其中没有 Objective-C,而 objc 的东西很丑。我的第二个原因显然是“生成所有这些 Objective-C 入口点的成本很高”(evgenii.com/blog/disabling-swift3-objc-inference-in-xcode9)。 这是一个很好的问题 Gadzair。我自己也在想同样的事情。显然,Swift 4 并不打算让我们使用@objc
注释。它旨在向后兼容早期项目。我想 @objc
注释最终可能会被弃用。你有没有想过如何在没有选择器的情况下实现刷新控件? (也许这甚至还不是 Apple 解决的问题,所以也许我们现在必须使用注释;不确定。)
是的,我对其进行了更多研究,基本上看来,Apple 尚未更新其所有 API。我希望在 WWDC 2018 上看到很多改进。
【参考方案1】:
我想摆脱他们
你不能,你需要停止想要。 #selector
是一个Objective-C特性,因此你必须明确地向Objective-C公开动作方法。 (之前你已经含蓄地暴露了它;现在你必须说出你的意思。)
【讨论】:
【参考方案2】:您可以使用@IBAction
代替@objc
两者都使用反射,但 Swift4 对 @IBAction
没有问题
【讨论】:
以上是关于如何避免在带有 Swift 4 的 iOS 11 中使用带有刷新控件的 @objc?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 ImageMagick 库与 Swift 4/iOS 11 一起使用?
如何实现UIButton的小型Dropdown,例如在Swift 4和iOS 11中选择货币?
IOS - 如何在 Swift 3 中从 JSON 中捕获动态数组维度
Xcode 11.4 Objective-C 语言的快速帮助,而不是 swift 语言,用于带有 Cocoapods 的 firebase API(iOS 13.4 应用程序)