0

Здравствуйте, столкнулся с непониманием как реализовать следующую конструкцию:

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

Помогите правильно прописать кнопки и получить нужные индексы

3
  • а почему вы не хотите вместо кнопок использовать метод? - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath для получения секции: [UITableView numberOfSections]
    – user11201
    26 окт 2013 в 8:20
  • потому что по касанию ячейки происходит одно событие, а по касанию кнопки - другое;) мне надо их отдельно обрабатывать и производить разные действия
    – atom-22
    26 окт 2013 в 14:43
  • 1
    Надеюсь мой ответ поможет тебе.
    – alexruden
    1 ноя 2013 в 11:00

2 ответа 2

1

Ячейки кастомные? Отлично. Смотри:

1.создай сабкласс UIButton (IndexedButton например), добавь в него свойство

 @property (nonatomic) NSIndexPath *button_indexPath;

В IndexedButton.m сделай @synthesize button_indexPath;

2.В классе твоей кастомной ячейки в .h файле подключаешь этот IndexedButton:

 #import "IndexedButton.h"

и кнопку, которую надо нажимать, делаешь не UIButton, a IndexedButton:

@property (nonatomic, retain) IBOutlet IndexedButton *buttonInCell;

В m-файле кастомной ячейки сделай @synthesize buttonInCell;

Там же ты эту кнопку и добавляешь в ячейку в методе:

-(id)initWithFrame:(CGRect)frame{    
    self = [super initWithFrame:frame];
    if (self){
        buttonInCell = [[IndexedButton alloc] initWithFrame:CGRectMake(0,0,50,30)];
        [self addSubview:buttonInCell];
    // здесь еще твой код
    }
    return self;    
}

3.Почти все. Теперь в главном классе, метод cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath     {
      // тут подключение твоей кастомной ячейки
        if (cell == nil) {
            //Создание ячейки
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault

                                           reuseIdentifier:CellIdentifier];
        }

          cell.buttonInCell.button_indexPath = indexPath; //присваиваем кнопке значение indexPath
            [cell.buttonInCell addTarget:self action:@selector(MyMethod:) forControlEvents:UIControlEventTouchUpInside]; //устанавливаем обработчик для нажатия кнопки

        // здесь еще твой код

        return cell;
    }

4.Финиш- метод MyMethod:

-(IBAction)MyMethod:(id)sender{
   NSIndexPath *path = [sender button_indexPath]; //извлекаем IndexPath с кнопки.
   //наслаждаемся результатом
   NSLog(@"секция = %i", path.section);
   NSLog(@"ряд = %i", path.row);
}

Надеюсь, разъяснил доступно.

1
  • да, подклассы создавал
    – atom-22
    1 ноя 2013 в 0:02
0

Создадим сабкласс ячейки:

@interface MyButtonedCell : UITableViewCell

@property (nonatomic, copy) void (^buttonPressedHandler)(void);

@end

Не важно как вы создаете ячейку, предположим, что ксиб или сториборд:

@implementation MyButtonedCell

- (IBAction)buttonPressed:(id)sender 
{
    if (self.buttonPressedHandler)
        self.buttonPressedHandler();
}

@end

Далее хорошо знакомый нам метод из UITableViewDataSource:

- (UITableViewCell *)tableView:(UITableView *)tableView cellFoRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyButtonedCell *cell = [tableView dequeReusableCellWithIdentifier:@"MyCellIdentifier"];
    /* конфигурим нашу ячейку как обычно  */
    /* создаем слабую ссылку на self для использования внутри блока, избегаем таким образом ритэйн лупа. Этот пункт ОБЯЗАТЕЛЕН К ИСПОЛНЕНИЮ, нельзя так просто взять и ИСПОЛЬЗОВАТЬ self внутри этого блока, только СЛАБУЮ ССЫЛКУ */
    __weak MyTableViewController *self_ = self; 
    cell.buttonPressedHandler = ^{
         /* делаем тут что хотим по нажатию кнопки в ячейке с доступным нам тут indexPath*/
    [self_ doSomethingByPressButtonAtObject: self_.items[indexPath.row]];
    };
    return cell;
}

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.