Swift 3:如何在多个控制器中使用“全局”按钮和操作

时间:2016-12-05 17:49:21

标签: swift uiviewcontroller swift3

假设我有20个视图控制器都需要相同的按钮和操作,有没有办法避免在每个控制器中实现相同的ibaction?我应该使用我的操作继承UIViewController,然后将我的控制器基于该子类吗?还是有其他方法吗?

3 个答案:

答案 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)
    }
}
  • 我在代码中写了这种东西和我的AutoLayout,因此是CGRect.zero框架的原因。
  • 您可以使目标/选择器可选。我过去常常这样,但这只是我消耗的代码。
  • 也可以使用方便的init()。您可以自行决定配置!
  • 有些事情可能无法在IB中设置,但大多数可以通过添加@ IBDesignable / @ IBInspectable。

答案 2 :(得分:0)

不确定你的意思"全球"按钮。但是如果我有一个调用function的按钮,它经常在多个视图控制器中重用,我通常会为protocol创建一个helperfunction对象,具体取决于合适的。

但如果你"全球"按钮指的是floating在同一个地方的按钮,无论用户在哪个ViewController,我认为你可以看看这个。 https://github.com/yoavlt/LiquidFloatingActionButton

这是一个像Google Mail应用中的浮动按钮。