2016-08-26 63 views
1

程序創建的按鈕時,我創建了一個自定義的警報視圖與動態創建按鈕執行代碼。除了我不知道如何使每個按鈕做不同的事情按下功能

,一切工作正常。

我的意思是我稱之爲功能addButton,我通過一個代碼塊(如UIAlertAction())。我想要在按下按鈕後執行該代碼,但實際上在加載按鈕時會執行該代碼。

對不起,如果我不清楚,但我不知道我的問題的具體條款。基本上我試圖重現UIAlertView,我不知道如何完全重拍UIAlertAction

這裏的方法(注:這是一個自定義類):

func addButton(buttonNumber number: Int, title: String, color: UIColor, actions:() -> Void) { 
    // Initialization 
    let button = UIButton(frame: CGRectMake(5, self.wrapper.bounds.height-CGFloat(55*number), self.wrapper.bounds.width-10, 50)) 
    // Configuration 
    button.setTitle(title, forState: .Normal) 
    button.backgroundColor = color 
    button.layer.cornerRadius = 10 
    button.addTarget(self, action: #selector(myCustomView.buttonPressed(actions:)), forControlEvents: .TouchUpInside) 

    wrapper.addSubview(button) 
} 

這是選擇(我知道這是不正確的):

func buttonPressed(actions actions:() -> Void) { 
    actions() // How do I get the actions from addButton? 
} 

這是當我打電話addButton

 let alertView = UIStoryboard(name: "Popups", bundle: nil).instantiateViewControllerWithIdentifier("HAlertView") as! HAlertViewVC 
     prepareAlert(alertView) 

     alertView.loadAlert(title: "Hold on", message: "You need to add at least the goal before saving", image: "Warning-Icon", numberOfActions: 1) 

     alertView.addButton(buttonNumber: 1, title: "Close", color: UIColor(red: 246.0/255.0, green: 71.0/255.0, blue: 71.0/255.0, alpha: 1), actions: { 
    //  alertView.dismiss() // This is the problem. That's just a function that hides the alert view but the issue is that it gets executed right away. 
     }) 

回答

1

你在找什麼是封:

在閉合(變量名)結束在更高/全球範圍
var some_code_block = { 
     print("my awesome code block!") 
    } 

將這個,那麼你就可以運行/改變塊隨意,只需加入「()」

func addCode() { 
    // Wont execute: 
    some_code_block = { print("new code inserted") } 
} 

func buttonPressed() { 
    // Executes: 
    some_code_block() 
} 

就我個人而言,我使用數組/字典來實時存儲/更新代碼塊。然後您可以遍歷/匹配索引/鍵來獲取您想要的代碼塊。

https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

如果您的問題實際上是使不同的按鈕,那麼您可以將新創建​​的一個UI按鈕的實例存儲到一個數組或字典

[UIButton]

數組/詞典的按鈕,與數組/字典的代碼塊匹配,當然可以工作......你只需要確保他們在正確的範圍/和同步索引/鍵。

或者,你可以創建一個類/結構保存一個UIButton實例,一個代碼塊,然後把類/結構到一個數組/詞典

// Make your own initializer for your purposes 
struct ButtonStuff { 
    var button: UIButton? 
    var code_block:()? 
} 

// Make empty array that holds type ButtonStuff (global/outer scope) 
var buttons: [ButtonStuff] = [] 

func addButton(pram1:Pram1, pram2:Pram2) { 
    // Make a new button (called locally inside of a func) 
    var new_button = ButtonStuff() 

    // Put stuff in here... 
    // new_button.button = pram1 
    // new_button.code_block = pram2 

    // Add our locally made new_button to the Global buttons array 
    buttons.append(new_buttons) 
} 

注:pram1,pram2可無論你想要什麼,但要存儲到代碼塊(無需運行),你需要輸入()。如果你想自動運行的代碼塊,你可以使用類型()->()

有做上述(你沒有使用選配)的許多方面;只是一個簡單的例子。然後你只需要做一些邏輯/算法來找到正確的按鈕,顯示它,然後調用代碼塊。

如果您有任何問題,需要我來編輯我的回答,請在評論中留下一個消息@fluidity

+0

感謝了很多人!它現在有效。 – Lawrence413

+0

NP !!我仍然是新的我自己。很高興我能幫上忙 – Fluidity