Вопрос по objective-c, ios – Цель c - Лучшая практика для обработки события касания кнопки для кнопки пользовательского UITableViewCell

15

Как лучше обрабатывать событие касания кнопки для кнопкиUITableViewCell?

мои занятия: MyViewController, MyCustomCell

Я могу придумать три варианта:

First option- Иметь кнопку как свойствоMyCustomCellи затем добавьте цель к нему вMyViewController .m файл сMyViewController как цель.

MyViewController .m файл

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"customCell";

    MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
    cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    [cell.theButton addTarget:self
                       action:@selector(theButtonTapped:)
             forControlEvents:UIControlEventTouchUpInside];
    }

    // Configure the cell...    
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)theButtonTapped:(UIButton *)sender
{
    MyCustomCell *selectedCell = (MyCustomCell *)sender.superview;

    if (selectedCell) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:selectedCell];
        MyModel *selectedModel = [self.model objectAtIndex:indexPath.row]; 

        // do something with the model...
    }
}

Second option- Если пользовательская ячейка была создана в IB, установите для владельца файла пера значениеMyViewController, воплощать в жизньbuttonTapped: метод вMyViewController и подключите событие Touch Up Inside кbuttonTapped: метод.

Third option- если пользовательская ячейка не была создана в IB, добавьте цель к кнопке вMyCustomCell .m файл сMyCustomCell как цель.
ОпределитьMyCustomCellDelegate добавлять@property (nonatomic, assign) id<MyCustomCellDelegate> delegate вMyCustomCell и вызовите этого делегата, когда нажмете кнопку.
ЗадаватьMyViewController в качестве делегата ячейки при создании ячеек и реализацииMyCustomCellDelegate протокол.

MyCustomCell .h файл

@class MyCustomCell;  

@protocol MyCustomCellDelegate <NSObject>
- (void)buttonTappedOnCell:(MyCustomCell *)cell;
@end

@interface MyCustomCell : UITableViewCell

@property (nonatomic, retain) UIButton *theButton;
@property (nonatomic, assign) id<MyCustomCellDelegate> delegate;

@end

MyCustomCell .m файл

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        self.theButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        self.theButton.frame = CGRectMake(10,10,50,30);
        [self addSubview:self.theButton];

        [self.theButton addTarget:self
                           action:@selector(theButtonTapped:)
                 forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)theButtonTapped:(UIButton *)sender
{
    [self.delegate buttonTappedOnCell:self];
}

MyViewController .m файл

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"customCell";

    MyCustomCell *cell = (MyCustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        cell.delegate = self;
    }

    // Configure the cell...    
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)buttonTappedOnCell:(MyCustomCell *)selectedCell
{
    if (selectedCell) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:selectedCell];
        MyModel *selectedModel = [self.model objectAtIndex:indexPath.row];

        // do something with the model...
    }
}
Error: User Rate Limit Exceeded Rick van der Linde

Ваш Ответ

5   ответов
0

Swift 3.0 Solution

cell.btnRequest.tag = indexPath.row

cell.btnRequest.addTarget(self,action:#selector(buttonClicked(sender:)), for: .touchUpInside)

func buttonClicked(sender:UIButton) {

    let buttonRow = sender.tag
 }
11

Error: User Rate Limit ExceededtagError: User Rate Limit Exceeded

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // bla bla bla
    if (!cell)
    {
        //bla bla bla
        [cell.yourButton addTarget:self selector:@selector(yourButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
    }
    // bla bla bla
    cell.yourButton.tag = indexPath.row;
}

-(void)yourButtonTapped:(id)sender
{
    int tag = [(UIButton *)sender tag];
    NSLog(@"tapped button in cell at row %i", tag);
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Eyal
Error: User Rate Limit Exceeded Eyal
0

Error: User Rate Limit Exceeded

typedef void (^ActionBlock)(id sender);

@interface UIBlockButton : UIButton {
     ActionBlock _actionBlock;
 } 

-(void)handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock) action;
​@end

@implementation UIBlockButton

 -(void) handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock) action
    {
      _actionBlock = action;
      [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
      }

  -(void) callActionBlock:(id)sender{
     _actionBlock(sender);
   }

@end

Error: User Rate Limit Exceeded

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (!cell)
    {
     cell.yourButton.tag = indexPath.row;// pass tag
     [cell.yourButton handleControlEvent:UIControlEventTouchUpInside withBlock:^(id sender) {
     // your selector action code
     NSLog(@"tapped button in cell at row %i",[(UIButton *)sender tag]);
     }];
   }  
}
0

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

1

Error: User Rate Limit Exceeded

Error: User Rate Limit ExceededUITableViewCellError: User Rate Limit ExceededindexPath свойство сообщить клетке свое точное положение.

Error: User Rate Limit ExceededUITableViewError: User Rate Limit ExceededinsertError: User Rate Limit ExceededdeleteError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded


I strongly recommend to use MVVM when you have to handle different touch events in your Cell.

Error: User Rate Limit ExceededUITableViewCellError: User Rate Limit ExceededCellViewModelError: User Rate Limit Exceeded

Похожие вопросы