2017-08-13 61 views
1

我從UIView繼承了其內部的自定義類是UIImageView和按鈕。我將它們添加到我的故事板中,作爲UIView,讓我們假設有兩個視圖。我有一個委託和一個函數,當按下按鈕時它會執行,並且它適用於兩個UIViews。被點擊區分是哪個按鈕,在自定義的UIView

我的問題是,我不知道如何告訴用戶點擊其中的一個。我需要將它傳遞給另一個VC,然後在被點擊的UIView中顯示合適的圖像。我一直在考慮設置ID或其他東西,但它似乎不是一個可擴展的想法。 我不能簡單地添加@IBAction因爲視圖是UIView作爲一個整體。

的視圖控制器裏面我加他們爲@IBOutlets:

@IBOutlet weak var view: CustomImageView! 
@IBOutlet weak var view2: CustomImageView! 

編輯: 我很接近創建可重用,可擴展的解決方案 - 我只是分配標籤,以每一個物體和比傳遞它並檢索它。我遇到的問題是我想訪問標籤的屬性。我沒有找到任何解決方法。

回答

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 
     } 
    } 
} 

解取而代之的是代表塊 ,你可以添加一個可選模塊,即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 

     } 
    } 
} 
+0

呀,這不是壞的,正如我所說的也許有效,但:不是可擴展的解決方案。你可以看到我的答案 - 這幾乎是我添加的所有代碼,在你的解決方案中有很多if else語句。在我看來,最好爲示例設置5個標籤,而不是創建大量的其他塊。 – codddeer123

+0

您也可以使用映射標籤或查看圖像引用的字典。 'let image = dict [tag]'但更好的方法是創建一個包含你的視圖的自定義組件。這樣你的ViewController就會保持精簡。 – messeb

+0

@ codddeer123你沒有說你想做什麼,所以這個答案包含通用的代碼。如果你只是想設置一個圖像,那麼你不需要'if'語句(儘管如果有2個以上的可能性,我會使用'switch')或者多個塊。你可以說'view.imageView.image = xxx'。涉及標籤的解決方案最好避免。他們可能會由於重複的標籤,每一次搜索視圖層次結構來識別標記的看法錯誤是低效 – Paulw11

相關問題