2014-11-15 2 views
0

В приложении MCQ я создаю множественные UIButton как этот программноКак создать функции buttonAction динамически в Swift

func createNewButton(buttonName: String, xPosition: CGFloat, yPosition: CGFloat) -> UIButton { 
    let myButton = UIButton(frame: CGRectMake(0, 0, 50, 50)) 
    myButton.center = CGPoint(x: xPosition, y: yPosition) 
    myButton.setImage(UIImage(named: buttonName), forState: UIControlState.Normal) 
    myButton.addTarget(self, action: "buttonName:", forControlEvents: UIControlEvents.TouchUpInside) 
    return myButton 
}  

Проблема в том, что для того, чтобы соответствовать функции этих кнопок нужно создать функцию. Поэтому функция должна выглядит

func buttonName(sender: UIButton!) { 
    // do some stuff 
}   

Эти функции на самом деле происходит, чтобы сохранить строку в массив, а строка, чтобы сохранить это имя самой функции. Если у нас есть, например buttonName: "blackberry", код будет установить изображение под названием "blackberry" и добавить целевую акцию под названием "blackberry", и я хотел бы поэтому buttonAction функции называется func blackberry(sender: UIButton) и эта функция будет сохранить строку "blackberry" в массиве String.

Но все это должно выполняться в функции начального параметра buttonName: String.

Или, может быть, я действительно не делаю правильные пути, и как я должен это делать?

ответ

2

Как об этом вместо этого. Отправьте все свои кнопки на processButton(button: UIButton). Когда вы создаете свои кнопки, установите для свойства tag уникальный номер для каждой кнопки. Тогда вы можете иметь массив, который переводит тег кнопки в строку.

var buttonNames: [String] = [] 
var currentIndex = 0 

func createNewButton(buttonName: String, xPosition: CGFloat, yPosition: CGFloat) -> UIButton { 
    let myButton = UIButton(frame: CGRectMake(0, 0, 50, 50)) 
    myButton.center = CGPoint(x: xPosition, y: yPosition) 
    myButton.setImage(UIImage(named: buttonName), forState: UIControlState.Normal) 
    myButton.addTarget(self, action: "processButton:", forControlEvents: UIControlEvents.TouchUpInside) 
    myButton.tag = currentIndex++ 
    self.buttonNames.append(buttonName) 
    return myButton 
} 

func processButton(button: UIButton) { 
    let string = buttonNames[button.tag] 
    // process string 
} 
+0

спасибо! Очень красивое решение! Сначала 'button.tag' всегда возвращал' 0', но мне удалось вручную установить тег для каждой кнопки, и теперь он работает! (Я не знал об этом параметре '.tag', это очень удобно). – magohamoth

+0

Да, спасибо за редактирование, это именно то, как я это сделал! – magohamoth