swift - addTarget() 不适用于自定义扩展
问题描述
我做了一个自定义UIView()
,我正在尝试向它添加一个 okButton。
然而。我已经添加了按钮,但是当在我的一个 ViewController 中显示我的 UIView 时,按钮不起作用。这是我的代码:
class Luna: UIView {
let luna = UIView()
let okButton = UIButton()
typealias completionHandler = (_ success:Bool) -> Void
// Not yet implemented
open var touchOutsideToHide: Bool = true;
private var screenWidth: CGFloat {
return UIScreen.main.bounds.width
}
override init(frame: CGRect) {
super.init(frame: frame)
okButton.setTitleColor(.blue, for: .normal)
okButton.setTitle("Okay", for: .normal)
okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)
let gesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.pressButton(_:)))
okButton.addGestureRecognizer(gesture)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
//The target function
@objc func pressButton(_ sender: UIButton){ //<- needs `@objc`
// .. //
print("btn hit")
}
我没有进入btn hit
控制台并且水龙头没有注册
该按钮是可见的,它被添加为一个子视图: 截图
解决方案
按钮有默认的触摸手势,你不需要添加它。只需按以下方式添加目标即可解决您的问题。创建客户类的协议并在同一类中为其声明委托,如下所示。
protocol LunaDelegate: class {
func okButtonTapped(sender: UIButton)
}
class Luna: UIView {
let luna = UIView()
let okButton = UIButton()
typealias completionHandler = (_ success:Bool) -> Void
weak var delegate: LunaDelegate?
// Not yet implemented
open var touchOutsideToHide: Bool = true;
private var screenWidth: CGFloat {
return UIScreen.main.bounds.width
}
override init(frame: CGRect) {
super.init(frame: frame)
okButton.setTitleColor(.blue, for: .normal)
okButton.setTitle("Okay", for: .normal)
okButton.titleLabel?.font = UIFont(name: "avenirnext-demibold", size: 16)
okButton.addTarget(self, action: #selector(pressButton(sender:)), for: .touchUpInside)
}
@IBAction func pressButton(sender: UIButton) {
if let selfDelegate = self.delegate {
selfDelegate.okButtonTapped(sender: sender)
}
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
然后按如下方式实现您的代码以使用您的自定义视图。当您按下按钮时,将在您的视图控制器中调用委托方法。
用法:
class LunaViewController: UIViewController, LunaDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let luna = Luna(frame: CGRect.init(x: 100, y: 100, width: 100, height: 40))
luna.delegate = self
self.view.addSubview(luna)
}
// MARK:- Luna Delegate
func okButtonTapped(sender: UIButton) {
print("OK Button Pressed From Luna View")
}
}
这是我在当前项目中已经使用的正确解决方案。我希望这能帮到您。
推荐阅读
- xml - 使 Textview 高度扩展以匹配同一水平 Lane 中更大的 Textview 高度大小
- python-3.x - 删除 matplotlib 中图像之间的间距
- flutter - 为什么展开的容器在列表视图中不可见?
- c++ - SDL: How to render multiple different textures based on mouse event
- javascript - Inject different Ad code based on UTM parameters
- javascript - Nuxtjs Vuex 不保存更改
- c++ - How to start explorer.exe with QProcess when the path to the specified file contains spaces?
- flutter - How to perform Pagination in Flutter
- javascript - Getting [TS] errors for files inside the node_modules folder
- android - OkHttpClient injected with Koin loses Authorization header