2012-06-19 2 views
4

Есть ли способ передать параметры через вызов addTarget, поскольку он вызывает другую функцию?Как передать параметры через селектор/действие?

Я также пробовал метод отправителя, но это тоже ломается. Каков правильный способ передачи параметров без создания глобальных переменных?

@my_button = UIButton.buttonWithType(UIButtonTypeRoundedRect) 
@my_button.frame = [[110,180],[100,37]] 
@my_button.setTitle("Press Me", forState:UIControlStateNormal) 
@my_button.setTitle("Impressive!", forState:UIControlStateHighlighted) 

# events 
newtext = "hello world" 
@my_button.addTarget(self, action:'buttonIsPressed(newtext)', forControlEvents:UIControlEventTouchDown) 
view.addSubview(@my_button) 


def buttonIsPressed (passText) 

    message = "Button was pressed down - " + passText.to_s 
    NSLog(message) 

end 

Update:

ОК, вот метод с переменной экземпляра, который работал.

@my_button = UIButton.buttonWithType(UIButtonTypeRoundedRect) 
@my_button.frame = [[110,180],[100,37]] 
@my_button.setTitle("Press Me", forState:UIControlStateNormal) 
@my_button.setTitle("Impressive!", forState:UIControlStateHighlighted) 

# events 
@newtext = "hello world" 
@my_button.addTarget(self, action:'buttonIsPressed', forControlEvents:UIControlEventTouchDown) 
view.addSubview(@my_button) 


def buttonIsPressed  
    message = "Button was pressed down - " + @newtext 
    NSLog(message) 
end 

ответ

7

Самый простой способ подключения «параметров» к рубимуту UIButton - это использование тегов.

Сначала настройте кнопку с атрибутом tag. Этот тег - это параметр, который вы хотите передать целевой функции.

@button = UIButton.buttonWithType(UIButtonTypeRoundedRect) 
@button.setTitle "MyButton", forState:UIControlStateNormal 
@button.frame =[[0,0],[100,50]] 
@button.tag = 1 
@button.addTarget(self, action: "buttonClicked:", forControlEvents:UIControlEventTouchUpInside) 

Теперь создать метод, который принимает sender в качестве параметра:

def buttonClicked(sender) 
    mytag = sender.tag 

    #Do Magical Stuff Here 
end 

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

def buttonClicked(sender) 
    mytag = sender.tag 

    if mytag == 1 
     string = "Foo" 

    else 
     string = "Bar" 
    end 

end 

Сначала я попытался установить действие с action: :buttonClicked, который работал, но не позволяют использовать метод sender.

0

Да, вы обычно создаете переменные экземпляра в своем классе Controller, а затем просто вызываете методы на них из любого метода.

В соответствии с documentation с использованием setTitle это общий способ установки заголовка экземпляра UIButton. Таким образом, вы делаете все правильно.