【发布时间】:2015-04-11 09:45:22
【问题描述】:
我正在创建一个 Swift 项目,我想定义一个特定的协议来强制其他组件实现 animate 方法:
protocol AnimatableBehavior {
@IBAction func animate()
}
问题是我希望这个方法是一个IBAction,但是我从 XCode 得到这个错误:
只有实例方法可以声明为“IBAction”
我的问题是,你将如何实现这样的事情?
我考虑过:
- 删除
@IBAction,但我需要记住在每个实现的类中添加它。不是很优雅且容易出错。 - 创建一个基类而不是协议,但随后我强制所有组件对我的基类进行子类化,而不是它们自己选择的子类,因此它不是一个有效的选项。
还有其他想法吗?
编辑:对以下 cmets 的回应。
协议上IBAction的想法是因为在项目中会有很多不同的开发者实现小的UI组件,它们都有animate方法。 可以通过编程方式或通过界面生成器添加组件,它们始终为IBAction 非常方便,因为我计划从 IB 文件中组合它们以简化视图控制器最大限度地发挥作用(这显然是一项仅限查看的任务)。
因此,下面提出的在控制器中添加一个仅调用组件的animate 的方法的解决方案并不好,因为它是冗余代码,并且会使您的控制器更加依赖您的视图。
让开发人员记住在方法上添加 IBAction 关键字的想法是可行的,但正如我所说的那样容易出错(我的意思是会有一些人忘记它),我想要确保始终可以从 IB 访问它。它还增加了额外的认知负担,因为我需要记录协议中缺少IBAction 并请求实现者手动添加它。
我知道这不是在 iOS 和 UIKit 中工作的常见方式,但这就是我发布问题的原因,也许有人有其他想法。
【问题讨论】:
-
我认为没有其他解决方案。也许看看大局,你想用这个实现什么?
-
我不明白如何让实际的实现者确定
animate()是否是@IBAction是否容易出错。请阅读我的回答,如果您有任何问题,请告诉我。我认为这可能是一个 XY 问题,但是如果您真正了解@IBAction是什么以及做什么,那么在协议中创建一个方法@IBAction根本就没有任何意义。 -
我已经阅读了您的评论,并且我了解
IBAction的作用,但它仍然有意义。查看我的编辑:) -
有什么解决办法吗?我理解这个问题,遇到了同样的事情。 Storyboard IBOutlets 需要在协议中“可检测”。你不能那样做真的很糟糕。希望它只看方法签名。
标签: ios swift protocols ibaction swift-protocols