2015-07-09 4 views
0

У меня есть пользовательский UITableViewCell, который содержит 3 UIButtons, и я хочу, чтобы при нажатии одной кнопки фон моей ячейки менялся. Но когда я нажимаю кнопку, все ячейки в моем UITableView меняют свой фон, а не только клетку, у которой есть кнопка внутри нее.изменить цвет фона UITableViewCell на кране на UIButton внутри

Пользовательские сотовый (.h)

@interface SCActionsViewCell : UITableViewCell 

@property (nonatomic, weak) UITableView *tableView; 
@property (nonatomic, strong) NSIndexPath *indexPath; 
@property (nonatomic, strong) UIButton *thanksButton; 
@property (nonatomic, strong) UIButton *commentsButton; 
@property (nonatomic, strong) UIButton *reButton; 


@end 

Пользовательские сотовый (.m)

#define TEXT_BUTTON_SIZE 25 
@implementation SCActionsViewCell 

- (void)awakeFromNib { 
    // Initialization code 
    self.backgroundColor = [UIColor colorLight]; 
    _thanksButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, self.contentView.frame.size.width/3, actionsCellHeight)]; 
    _commentsButton = [[UIButton alloc] initWithFrame:CGRectMake(self.contentView.frame.size.width/3, 0, self.contentView.frame.size.width/3, actionsCellHeight)]; 
    _reButton = [[UIButton alloc] initWithFrame:CGRectMake(self.contentView.frame.size.width*2/3, 0, self.contentView.frame.size.width/3, actionsCellHeight)]; 

    _thanksButton.titleLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:TEXT_BUTTON_SIZE]; 
    _commentsButton.titleLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:TEXT_BUTTON_SIZE]; 
    _reButton.titleLabel.font = [UIFont fontWithName:kFontAwesomeFamilyName size:TEXT_BUTTON_SIZE]; 

    [_thanksButton setTitle:[NSString fontAwesomeIconStringForEnum:FAThumbsOUp] forState:UIControlStateNormal]; 
    [_commentsButton setTitle:[NSString fontAwesomeIconStringForEnum:FACommentsO] forState:UIControlStateNormal]; 
    [_reButton setTitle:[NSString fontAwesomeIconStringForEnum:FARetweet] forState:UIControlStateNormal]; 

    [_thanksButton setTitleColor:[UIColor sGreen] forState:UIControlStateSelected]; 
    [_reButton setTitleColor:[UIColor sGreen] forState:UIControlStateSelected]; 

    [self addSubview:_thanksButton]; 
    [self addSubview:_commentsButton]; 
    [self addSubview:_reButton]; 
} 

@end 

SCViewDataSource (TableviewDataSource)

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return self.posts.count; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 2; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
     SCActionsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SCActionsViewCell" forIndexPath:indexPath]; 
     cell.tableView = tableView; 
     cell.indexPath = indexPath; 
     [cell.thanksButton addTarget:(SCViewController *)tableView.delegate action:@selector(touched:) forControlEvents:UIControlEventTouchUpInside]; 
     return cell; 
} 

SCViewController.m

-(void)touched:(UIButton *)button{ 
    NSLog(@"indexPath : %@",((SCActionsViewCell *)button.superview).indexPath); 
    ((SCActionsViewCell *)button.superview).backgroundColor = [UIColor blueColor]; 
} 

В этом случае, когда я нажимаю thanksButton в клетке все клетки меняют свою предысторию blueColor ...

ответ

0

Ok я узнал от моей: не использовать [tableView dequeueReusableCellWithIdentifier:forIndexPath:] но [[CustomCell alloc] init] и создать init функцию в классе пользовательских ячеек.

Таким образом, каждая ячейка будет новым объектом.

0

(Попробуйте) Изменено вы коснулись methood используя следующий код.

-(void)touched:(UIButton *)button{ 
    NSLog(@"indexPath : %@",((SCActionsViewCell *)button.superview).indexPath); 
    ((SCActionsViewCell *)button.superview).contentView.backgroundColor = [UIColor blueColor]; 
} 
+0

не работает, addTarget должна быть самостоятельной в вашем случае, и это изменить весь фон ячеек .... – Gautier

+0

Добавьте еще одно свойство для ячейки, названной '@property BOOL tapped; ', затем, когда кнопка нажата, установите ее в YES и покажите синий фон только для постукивания == YES. 'cell.tapped = YES' –

+0

Вы можете добавить Recognizer для распознавания десктов –

0

Добавить объект (возможно, NSDictionary или NSArray) для отслеживания того, какие индексы были уже использованы. Создание новой ячейки каждый раз очень дорого. Я предлагаю вам не отказаться от [tableView dequeueReusableCellWithIdentifier:forIndexPath:].

Вы можете попробовать это:

- (void)touched:(UIButton *)sender { 
    NSIndexPath *indexPath = ((SCActionsViewCell *)button.superview).indexPath; 
    [self.thankedIndexPaths addObject:indexPath]; 
} 

Затем вы можете установить цвет фона соответственно:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    SCActionsViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SCActionsViewCell" forIndexPath:indexPath]; 
    cell.tableView = tableView; 
    cell.thanked = [self.thankedIndexPaths containsObject:indexPath]; 
    cell.indexPath = indexPath; 
    [cell.thanksButton addTarget:(SCViewController *)tableView.delegate action:@selector(touched:) forControlEvents:UIControlEventTouchUpInside]; 
    return cell;  
}