需求:为UIView增加一个方法,调用方法时控制一个label的显示与消失
思路:为UIView添加一个协议,就可以直接使用view去调用协议里的方法
首先,我们先创建一个protocol,起个名字
protocol ShowTextable {
}
既然我们要控制一个label的显示,那么首先要有一个父视图
protocol ShowTextable {
var backgroundView : UIView { get }
}
创建一个父视图,因为protocol里只能声明,实现需要写在extension里
extension ShowTextable {
var backgroundView : UIView {
return UIApplication.shared.keyWindow!
}
}
这里默认父视图为keyWindow
现在我们需要一个全局的label,和一个shouText和hideText方法
注意:此处的label需要写在protocol外部,因为写在内部的话每次使用label都会重复创建
private let label : UILabel = {
return UILabel()
}()
protocol ShowTextable {
var backgroundView : UIView { get }
func showText(text: String?)
func hideText()
}
extension ShowTextable {
var backgroundView : UIView {
return UIApplication.shared.keyWindow!
}
func showText(text: String? = "defaultText"){
label.frame = CGRect(x: 50, y: 50, width: 100, height: 30)
label.text = text
backgroundView.addSubview(label)
}
func hideText() {
label.removeFromSuperview()
}
}
现在个协议已经完成了,我们需要让UIView去遵循这个协议
extension UIView : ShowTextable {}
还有最后一步,就是当UIView遵循这个协议的时候,让backgroundView为这个UIView的实例
extension ShowTextable where Self : UIView {
var backgroundView: UIView { return self }
}
这样就可以直接用view实例去调用showText和hidtext方法了!!