解决方案与代表 你可以添加自定义委托协议,为您的自定义视图
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
}
}
}
解取而代之的是代表块 ,你可以添加一个可选模块,即EXE cuted如果在视图按钮被点击:
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
}
}
}
呀,这不是坏的,正如我所说的也许有效,但:不是可扩展的解决方案。你可以看到我的答案 - 这几乎是我添加的所有代码,在你的解决方案中有很多if else语句。在我看来,最好为示例设置5个标签,而不是创建大量的其他块。 – codddeer123
您也可以使用映射标签或查看图像引用的字典。 'let image = dict [tag]'但更好的方法是创建一个包含你的视图的自定义组件。这样你的ViewController就会保持精简。 – messeb
@ codddeer123你没有说你想做什么,所以这个答案包含通用的代码。如果你只是想设置一个图像,那么你不需要'if'语句(尽管如果有2个以上的可能性,我会使用'switch')或者多个块。你可以说'view.imageView.image = xxx'。涉及标签的解决方案最好避免。他们可能会由于重复的标签,每一次搜索视图层次结构来识别标记的看法错误是低效 – Paulw11