【问题标题】:How can I override this class function?我怎样才能覆盖这个类函数?
【发布时间】:2018-03-25 12:14:14
【问题描述】:

我有一个扩展类,我正在扩展UIButton,如下所示,它工作正常。

extension UIButton {    
    class func backButtonTarget(_ target: Any, action: Selector) -> UIBarButtonItem {        
        let backButton = UIButton(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(58), height: CGFloat(15)))
        backButton.setTitle("Cancel",for: .normal)
        let barBackButtonItem = UIBarButtonItem(customView: backButton)
        backButton.addTarget(target, action: action, for: .touchUpInside)
        return barBackButtonItem
    }
}

但是现在,我需要为一些视图控制器更改它的标题,所以我在考虑它的覆盖,但失败了。这怎么能被覆盖,以便我可以更改它的title

【问题讨论】:

标签: ios swift3 uibutton swift-extensions


【解决方案1】:

扩展不能/不应覆盖。

无法按照 Apple 的 Swift 指南中的说明覆盖扩展中的功能(如属性或方法)。

扩展可以为类型添加新功能,但不能覆盖现有功能。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

您可以像这样子类化条形按钮项

class CustomBarButtonItem: UIBarButtonItem {

      override func awakeFromNib() {
      super.awakeFromNib()
      customize()
     }

     func customize() {
         frame = CGRect(x: CGFloat(0), y:    CGFloat(0), width: CGFloat(58), height: CGFloat(15))
         // Add more as per requirement
     }

}

【讨论】:

  • 感谢您的回答,谢谢,但我必须更改其名称。
  • 您可以通过覆盖视图控制器中需要更改标题的 CustomBarButtonItem 来设置标题。您可以在上面的类中设置默认标题。如果需要更改,您可以根据需要覆盖、调用超级方法并更改标题。
【解决方案2】:

title 设为函数的String 参数,以便您可以调用它并提供自定义标题。

class func backButtonTarget(_ target: Any, action: Selector, title: String) -> UIBarButtonItem {
        let backButton = UIButton(frame: CGRect(x: 0, y: 0, width: 58, height: 15))
        backButton.setTitle(title, for: .normal)
        let barBackButtonItem = UIBarButtonItem(customView: backButton)
        backButton.addTarget(target, action: action, for: .touchUpInside)
        return barBackButtonItem
    }
}

【讨论】:

  • 是的,我已经考虑过了,但我必须在无数类中更改它。这是我不想要的。
  • 您可以将标题设为可选,如果它是例如nil,您将保留原始标题,因此您无需更改现有代码中的任何内容,而是需要显示特定标题的地方。
  • 感谢您的回答,您能否告诉我如何在此代码中使其成为可选?
  • class func backButtonTarget(_ target: Any, action: Selector, title: String? = nil) -> UIBarButtonItem { ... if let title = title { backButton.setTitle(title, for: .normal) } ... },或类似的东西可以完成这项工作(我不打算复制@the4kman的答案来制作另一个,但你应该通过我的评论了解要点).
  • 谢谢,够了,让我试试这个,然后回来找你。
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2014-03-31
  • 2021-05-23
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多