2015-02-18 2 views
0

В моем приложении у меня есть ячейки UITableView с несколькими кнопками. 4 UIButtons на ячейку. Для каждого UIButton я хочу добавить UILongPressGestureRecognizer. Код ниже:Обнаружение, если UITableViewCell является повторно используемой ячейкой

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    FriendViewCell *cell = (FriendViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 


    for(int i =0; i<4; i++) { 




      UIButton *button = cell.buttons[i]; 
      UILabel *label = cell.labels[i]; 

      [button setTag:(int)indexPath.row*4+i]; 
      [button addTarget:self action:@selector(friendTapped:) forControlEvents:UIControlEventTouchUpInside]; 

      UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressFriend:)]; 

      [button addGestureRecognizer:longPress]; 

} 

} 

Я просто понял, что, хотя, если ячейка повторно, то я добавляю жест несколько раз в кнопки. Есть ли способ определить, будет ли созданная ячейка повторно использоваться или новая? Я не думаю, что могу переместить код в класс FriendViewCell, потому что мой целевой адрес friendTapped: находится в моем UITableViewController. Любые указатели будут очень благодарны! спасибо

+0

Ваш код неполный, где вам создавать/распределять ячейки? – meronix

+0

Почему бы вам не настроить теги и распознаватели жестов в вашем раскадровке (или файле nib)? – jlehr

+0

@jlehr количество кнопок динамическое и зависит от размера массива, поэтому теги не могут быть настроены в раскадровке. Правильно? – Kex

ответ

1

Более простым способом было бы создать пользовательский класс для вашего Button. Этот класс будет иметь UILongPressGestureRecognizer, созданный при инициализации, и делегат (ваш контроллер), который будет вызываться при запуске жестов.

.h

@class MyLongPressedButton 
@protocol MyLongPressedButtonDelegate 
- (void)buttonIsLongPressed:(MyLongPressedButton *)button; 
@end 

@interface MyLongPressedButton 
@property (nonatomic, weak) id<MyLongPressedButtonDelegate > delegate 
@end 

.m

-(id)init { 
    if (self = [super init]) { 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)]; 
    [self addGestureRecognizer:longPress]; 

    } 
    return self; 
} 

-(void)longPress:(id)sender { 
    [_delegate buttonIsLongPressed:self] 
} 
0

Я бы рекомендовал размещать код внутри ячейки и создание метода делегата, который будет возвращать ссылку на ячейку.

E.g.

@protocol myAwesomebuttonCellDelegate <NSObject> 

- (void)myAwesomeCell:(MyAwesomeCell *)cell buttonPressed:(UIButton *)btn; 

@end 

Затем в контроллере представления вы можете использовать:

NSIndexPath *index = [tblView indexPathForCell:cell]; 

получить/раздел строки

0

Прежде всего, есть быстрые способы решения этого - вы можете проверить существующий распознаватели жеста на кнопке, есть ли длинный распознаватель жестов нажатия.

Немного лучшее решение заключается в определении свойства на ячейке, например.

@property (nonatomic, assign) BOOL recognizerAdded 

Однако, лучшим решением будет сделать это внутри класса клеток

@implementation FriendViewCell 

- (void)awakeFromNib { 
    //add the recognizers 
} 

@end 

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

Конечно, вам понадобится делегат в ячейке, чтобы уведомить вас о действии, но это будет более чистое решение.

+0

Но если я сделаю это в ячейке, я получу ошибку, потому что метод выбора находится в моем UITableViewController – Kex

+0

@Kex. В этом весь смысл использования делегата. Ячейку известно, что нажата кнопка, и она передаст информацию ее делегату (viewController). Если вы не знаете, что такое или как делегировать, вы можете проверить эту презентацию Apple Doc: https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation. html – KIDdAe

+0

спасибо, я проверю это. – Kex

Смежные вопросы