假设我有20个视图控制器都需要相同的按钮和操作,有没有办法避免在每个控制器中实现相同的ibaction?我应该使用我的操作继承UIViewController,然后将我的控制器基于该子类吗?还是有其他方法吗?
答案 0 :(得分:1)
我最终遵循此处概述的基于协议/价值的方法 - > subclassing-can-suck-and-heres-why
在我的情况下,我有一个"设置"几个视图上的按钮。
protocol SettingsButtonRenderer {
func goToSettings()
}
extension SettingsButtonRenderer where Self: UIViewController {
func goToSettings() {
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let settingsNavigationController = storyBoard.instantiateViewController(withIdentifier: "SettingsNavigationController")
present(settingsNavigationController, animated: true, completion: nil)
}
}
class DeliveryTabViewController: UIViewController, SettingsButtonRenderer {
@IBOutlet weak var goToSettingBtn: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
goToSettingBtn.target = self
goToSettingBtn.action = #selector(DeliveryTabViewController.settingsClicked as (DeliveryTabViewController) -> () -> ())
}
func settingsClicked() {
goToSettings()
}
}
答案 1 :(得分:0)
您可以继承UIButton并创建一个便利初始化程序。
public class CloseButton: UIButton {
convenience init(
tag :Int,
target :Any,
action :Selector
)
{
self.init(frame: CGRect.zero)
self.backgroundColor = UIColor.red
self.setTitle("Close", for: .normal)
self.tintColor = UIColor.white
self.layer.cornerRadius = 5
self.layer.borderColor = UIColor.white.cgColor
self.layer.borderWidth = 1
self.tag = tag
self.addTarget(target, action: action, for: .touchUpInside)
}
}
答案 2 :(得分:0)
不确定你的意思"全球"按钮。但是如果我有一个调用function
的按钮,它经常在多个视图控制器中重用,我通常会为protocol
创建一个helper
或function
对象,具体取决于合适的。
但如果你"全球"按钮指的是floating
在同一个地方的按钮,无论用户在哪个ViewController
,我认为你可以看看这个。 https://github.com/yoavlt/LiquidFloatingActionButton
这是一个像Google Mail应用中的浮动按钮。