ios - Swift addTarget 到按钮并从 UIview 文件调用不同 View Controller 文件中的函数
问题描述
现在我练习在我的 Swift 项目中应用 MVC 模式。我有一个视图控制器 (VC) 文件和一个 UIView 文件。
在 VC 文件中,我添加了 UIView 文件,如下所示。
class MyViewController: UIViewController {
private var myView = MyView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(myView)
myView.frame = CGRect(origin: .zero, size: view.bounds.size)
// and other codes...
}
@objc func showDeleteAlert() {
print("showDelete is pressed")
}
}
然后,在 UIView 文件中,我添加了一些视图和按钮(我只是复制了按钮部分)。
class MyView: UIView {
lazy var deleteButton: UIButton = {
let button = UIButton()
button.setTitle("delete", for: .normal)
button.addTarget(target: MyViewController, action: #selector(showDeleteAlert), for: UIControl.Event.touchUpInside) // -> I get error in here saying "Cannot find 'showDeleteAlert' in scope"
return button
}()
// and more codes...
}
我在这里要做的是如何在按下 deleteButton 时将目标设置为 showDeleteAlert 函数?
我看到教程将“self”添加为目标参数,但在我的情况下,我将视图和控制器分开,因此不确定如何访问 MyViewController 中的函数。
谢谢...
解决方案
您在这里有两个选择:
- 进入
addTarget
视图控制器viewDidLoad
:
myView.deleteButton.addTarget(self, action: #selector(showDeleteAlert), for: UIControl.Event.touchUpInside)
- 如果您想将按钮设为私有(这是一个很好的做法),您可以将代理功能添加到您的
MyView
func addDeleteButtonTarget(_ target: Any?, action: Selector) {
deleteButton.addTarget(target, action: action, for: .touchUpInside)
}
并称之为:
myView.addDeleteButtonTarget(self, action: #selector(showDeleteAlert))
无论如何,您不能调用button.addTarget(target: MyViewController, ...)
,因为您需要传递 的实例MyViewController
,而不仅仅是类名。
推荐阅读
- php - PHP:如何从 UDP 服务器获取答案
- c# - 使用自定义标签将测试标记为不确定的 SpecFlow C#
- sql - 如何在不转储的情况下更改 postgresql 中列的位置
- docker - 使用外部文件构建 Docker
- php - 如何使用php从mongodb文档中删除或删除数组数据
- excel - 工作表类的运行时错误“1004”粘贴方法失败(仅在选定的计算机上)
- mongodb - 删除具有对象键值猫鼬的数组元素
- php - 警告:array_column() 期望参数 1 为数组,在
- python - Plotly choropleth 在在线但不在离线模式下工作
- angular - 更新 Firebase 和 Angular 后获取“firebase.auth 不是函数”