解決方案與代表 你可以添加自定義委託協議,爲您的自定義視圖
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