Как передать параметры с помощью @selector

Мне нужно передать параметры с помощью @selector, и вот метод, который мне нужно вызвать с помощью селектора:

-(void)clickedInfo:(NSString *)itemIndex{
// some work with itemIndex
}

Я знаю, что могу использовать промежуточный метод, описанный здесь.

Этот подход не работает в моем случае, потому что я добавляю цель в uibutton в методе cellForItemAtIndexPath для collectionView.

Параметр, который мне нужно передать методу clickedInfo, - indexPath.row, и я не могу получить этот параметр в промежуточном методе.

Заранее спасибо


person onuryilmaz    schedule 30.05.2013    source источник


Ответы (3)


Вы можете использовать селектор performSelector:withObject: для передачи объекта.

Пример:

[self performSelector:@selector(clickedInfo:) withObject:myIndex];

- (void) clickedInfo:(NSString *)itemIndex{
// some work with itemIndex
}

Изменить: должно быть просто @selector(clickedInfo:), а не то, что у меня было раньше.

Изменить: используя предложение @newacct, я бы рекомендовал сделать что-то подобное следующему:

- (UITableViewCell *)tableView:(UITableView)tableView cellForRowAtIndexPath:(NSIndexPath)indexPath
{
    button.tag = indexPath.row;
    [button performSelector:@selector(clickedInfo:)];
    // or
    [button addTarget:self action:@selector(clickedInfo:) forControlEvents:UITouchUpInside];
}

- (void) clickedInfo:(id)sender
{
    int row = sender.tag;
    // Do stuff with the button and data
}
person Eric Amorde    schedule 30.05.2013
comment
Вы правы, это было неправильно, обновил мой ответ, но кто-то уже привел такой же пример. - person Eric Amorde; 31.05.2013
comment
вопрос указывает на то, что они хотят настроить действие для кнопки - person newacct; 31.05.2013
comment
Хорошо бы кнопка удерживала объект? Иначе то, чего он хочет, на самом деле невозможно. Я думал, он сказал, что делает это методом cellForRowAtIndexPath. - person Eric Amorde; 31.05.2013
comment
@EricAmorde: Да, он делает это в cellForRow..., чтобы настроить ячейку, которая, вероятно, содержит кнопку, на которой он хочет настроить действие. - person newacct; 31.05.2013
comment
Я сделал то, что вы объяснили, с небольшой разницей, разница в том, что я использовал titlelabel uibutton, а не тег, так как мне нужно было сохранить строку. ваш код помог спасибо - person onuryilmaz; 31.05.2013
comment
Ах, это тоже работает, пока вы хотите, чтобы название кнопки было таким. Рад, что ты это понял! Спасибо @newacct за предложения. - person Eric Amorde; 31.05.2013

Итак, вы хотите сохранить некоторую информацию, к которой можно получить доступ нажатием кнопки. Вот некоторые варианты:

  • Используйте свойство tag элемента управления. (может хранить только целое число)
  • Подкласс UIButton и используйте этот класс для кнопки. У класса может быть поле, в котором хранится информация.
  • Используйте связанные объекты (ассоциативные ссылки), чтобы прикрепить объект к кнопке. Это наиболее общее решение.
person newacct    schedule 30.05.2013
comment
Свойство tag кажется хорошей идеей для того, что он хочет. Просто установите для тега значение indexPath.row вместо того, чтобы передавать его в качестве параметра. - person Eric Amorde; 31.05.2013
comment
Я использовал поле titlelabel uibutton для хранения строкового значения, так как мне не нужно ничего отображать, используя это. спасибо - person onuryilmaz; 31.05.2013

к нему обращаются во многих местах, но на него легче ответить, чем указать вам туда:

[someObject performSelector:@selector(clickedInfo:) withObject:someOtherObject];

где someObject - получатель, а someOtherObject - параметр, переданный в clickedInfo

person Grady Player    schedule 30.05.2013
comment
вопрос указывает на то, что они хотят настроить действие для кнопки - person newacct; 31.05.2013