Пользовательские UITableViewCell и IBAction

У меня есть пользовательский UITableViewCell, на который я добавил кнопку, я связал эту кнопку с IBAction в моем viewController. Теперь проблема, с которой я сталкиваюсь, заключается в том, как узнать, из какой ячейки была создана эта кнопка. Когда я представляю свой viewController, в котором есть таблица и несколько строк (настраиваемый UITableViewCell), теперь, когда пользователь нажимает кнопку, вызывается действие, но как я узнаю, какая это была строка.

Потому что на основе индекса строки мне нужно сохранить какое-то значение.

Редактировать: теперь у меня есть некоторое представление об этом, но все же я не уверен, как я это сделаю, поэтому похоже, что в моем методе tableViewController cellForRowAtIndexPath мне нужно сделать что-то вроде этого

[cell.button1 addTarget:self action:@selector(addToCart:) forControlEvents:UIControlEventTouchUpInside];

И тогда я должен написать метод

-(IBAction) addToCart:(id) sender

Но все же я не знаю, как мне получить индекс строки в моем методе addToCart. Ценю твою помощь.


person Yogesh    schedule 05.11.2010    source источник
comment
См. этот вопрос или этот вопрос.   -  person    schedule 05.11.2010
comment
Я попробовал, как было предложено по приведенной выше ссылке UIButton button = (UIButton *)sender; UITableViewCell *cell = (UITableViewCell)[кнопка superview]; int row = [[self tableView] indexPathForCell:cell].row; NSLog(@Идентификатор строки: %@, row); но это всегда возвращает строку как 0. Может ли проблема заключаться в том, что я использую пользовательскую UITableViewCell?   -  person Yogesh    schedule 08.11.2010
comment
row является целым числом, поэтому используйте %d в строке формата (не %@).   -  person    schedule 08.11.2010
comment
Также должно быть UITableViewCell *cell = (UITableViewCell *)[button superview]; (нужна звездочка). Если все еще не работает, вы должны опубликовать, как вы добавляете кнопку в ячейку в cellForRowAtIndexPath и полный метод обработчика кнопок.   -  person    schedule 08.11.2010
comment
Привет, aBitObvious, Спасибо за всю вашу помощь, у меня все работает, вероятно, так же, как вы предложили. Большое спасибо.   -  person Yogesh    schedule 08.11.2010


Ответы (4)


Хорошо, наконец-то я получил ответ, просматривая разные форумы, люди предлагали сделать что-то подобное

в пользовательском контроллере табличного представления в cellForRowAtIndexPath сделайте это

cell.addToCart.tag = indexPath.row;
[cell.addToCart addTarget:self action:@selector(addToCart:)    
                               forControlEvents:UIControlEventTouchUpInside];

где addToCart — это имя UIButton в моем customUITableViewCell. Кажется, это не сработало для меня. Так вот что я сделал

-(IBAction) addToCart:(id) sender{
        NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)
                    [[sender superview] superview]];
    NSLog(@"The row id is %d",  indexPath.row); 
 }

А затем через конструктор интерфейсов я связал действие моей кнопки с addToCart IBAction на моем контроллере табличного представления.

person Yogesh    schedule 08.11.2010
comment
Вы имеете в виду, что вы связали действие своей кнопки с addToCart IBAction в своей пользовательской UITableViewCell, верно? - person fulvio; 10.01.2011
comment
В приведенном выше примере строка всегда возвращает 0. Вместо этого я сделал это: -(IBAction)addToCart:(id)sender { NSLog(@The row id is %d, [sender tag]); } - person MonkeyBlue; 15.12.2012
comment
Я пытаюсь это сделать, и он не вызывает IBAction в моем пользовательском UITableViewCell. Есть ли что-нибудь еще в вашем решении? - person circuitlego; 18.07.2013

Гораздо менее хакерский.

[cell.button1 addTarget:self action:@selector(addToCart:event:) forControlEvents:UIControlEventTouchUpInside];


- (void)addToCart:(id)sender event:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];
    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];

}
person iHorse    schedule 09.07.2012

Принятый ответ больше не работает. См. этот пост.

Делается это так:

- (void)checkButtonTapped:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {
     ...
    }
}
person gsach    schedule 17.06.2014

Многие разработчики использовали настраиваемое представление для отображения пользовательской ячейки в представлении таблицы для более старой версии iOS. Если вы один из них, то вам придется столкнуться с проблемой, что ваше действие по нажатию кнопки больше не будет работать с iOS7.

Как это решить:

У вас есть два варианта:

Вариант 1. Создайте новый макет с новой ячейкой таблицы вместо просмотра. и снова поместите все макеты в ячейку таблицы.

Я знаю, это потребует много усилий. Если вы не хотите этого делать, у нас есть для этого очень маленький лайфхак: вариант 2

Вариант 2. Создайте IBOutlet для своей кнопки и добавьте эту кнопку в качестве подпредставления представления содержимого вашей ячейки.

[self.myCell.contentView addSubview:self.btn_click];

Приведенная выше строка кода добавит btn_click в качестве подпредставления вашего представления контента. Теперь действие нажатия кнопки должно работать.

person Shreesh Garg    schedule 30.09.2013