我有一个继承自UIView
的自定义类,其中包含UIImageView
和按钮。我将它们添加到我的故事板UIView
,让我们说有两种观点。我有一个委托和一个按下按钮时执行的功能,它适用于两个UIViews。
我的问题是我不知道怎么知道哪一个被点击了。我需要将它传递给另一个VC,然后在点击的UIView
中显示合适的图像。我一直在考虑设置ID或其他东西,但它似乎不是一个非常可扩展的想法。
而且我不能简单地添加@IBAction
,因为该视图是UIView
整体。
在ViewController中我将它们添加为@IBOutlets:
@IBOutlet weak var view: CustomImageView!
@IBOutlet weak var view2: CustomImageView!
编辑: 我非常接近于创建可重用且可扩展的解决方案 - 我只是将标签分配给每个对象而不是传递它并检索它。我遇到的问题是我想访问标签的属性。我找不到任何解决方法。
答案 0 :(得分:2)
代表解决方案 您可以为自定义视图添加自定义委托协议
protocol CustomViewDelegate {
func didSelectCustomView(_ view: CustomView)
}
class CustomView: UIView {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myButton: UIButton!
weak var delegate: CustomViewDelegate?
@IBAction func buttonPressed(sender: UIButton) {
delegate?.didSelectCustomView(self)
}
}
在ViewController中,您必须检查委托调用的视图来自:
class ViewController: UIViewController {
@IBOutlet weak var view1: CustomView!
@IBOutlet weak var view2: CustomView!
override func viewDidLoad() {
super.viewDidLoad()
view1.delegate = self;
view2.delegate = self;
}
}
extension ViewController: CustomViewDelegate {
func didSelectCustomView(_ view: CustomView) {
if view == view1 {
// view1 clicked
} else {
// view2 clicked
}
}
}
使用块解决方案 如果单击视图中的按钮,则可以添加一个可执行的块来代替委托:
class CustomView: UIView {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myButton: UIButton!
var clicked: ((CustomView) -> Void)?
@IBAction func buttonPressed(sender: UIButton) {
clicked?(self)
}
}
在ViewController中,您可以将块添加到视图中:
class ViewController: UIViewController {
@IBOutlet weak var view1: CustomView!
@IBOutlet weak var view2: CustomView!
override func viewDidLoad() {
super.viewDidLoad()
view1.clicked = { view in
}
view2.clicked = { view in
}
}
}