user_name
user_name

Reputation: 67

UITableViewCell add button

I want to add some buttons to custom cell, when I click the button and other buttons also change. How can I click a button without changing the other buttons?

enter code here
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    SViewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[SViewTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault   
        reuseIdentifier:identifier];
    }
    cell.cellButton.tag = indexPath.row;
    [cell.cellButton addTarget:self action:@selector(clickMe:) 
         forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (void)clickMe:(UIButton *)sender
{
    SViewTableViewCell *cell = (SViewTableViewCell *)[[sender superview]superview];
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    if (sender.tag == 0) {
        if ([sender.titleLabel.text isEqualToString:openStr]) {
             [sender setTitle:closeStr forState:UIControlStateNormal];
        }
        else{
             [sender setTitle:openStr forState:UIControlStateNormal];
        }
    }
}

Upvotes: 0

Views: 2183

Answers (4)

Vineesh TP
Vineesh TP

Reputation: 7943

Please set tag for each button in custom tableViewCell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    SViewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[SViewTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault   
        reuseIdentifier:identifier];
    }
    UIButton *button1 = (UIButton *)[cell viewWithTag:1];
    UIButton *button2 = (UIButton *)[cell viewWithTag:2];
    [button1 addTarget:self action:@selector(clickMe:) 
         forControlEvents:UIControlEventTouchUpInside];
   [button2 addTarget:self action:@selector(clickMe:) 
         forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

Upvotes: 1

Sujith Thankachan
Sujith Thankachan

Reputation: 3506

Use the code below:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"cell";
    SViewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[SViewTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    cell.cellButton.tag = indexPath.row;
    [cell.cellButton addTarget:self action:@selector(clickMe:) 
     forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (void)clickMe:(UIButton *)sender {
    SViewTableViewCell *cell = (SViewTableViewCell *)[[[sender superview]superview] superview];
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    [self keepSelectionRemainsSameForIndexPath:indexPath andSender:sender];
}

- (void)keepSelectionRemainsSameForIndexPath:(NSIndexPath *)indexPath andSender:(UIButton *)sender {
    if (sender.tag == indexPath.row) {
        if ([sender.titleLabel.text isEqualToString: openStr]) {
            [sender setTitle:closeStr forState:UIControlStateNormal];
        } else {
            [sender setTitle: openStr forState:UIControlStateNormal];
        }
    }
}

Upvotes: 0

simalone
simalone

Reputation: 2768

I think it's a issue about tableView cell reuse again, you should set the button title in cellForRow to keep reuse cell have a correct title, you should try code like this:

openDict is a NSMutableArray you should define, and this just a example.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    SViewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[SViewTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault   
        reuseIdentifier:identifier];
        [cell.cellButton addTarget:self action:@selector(clickMe:) 
         forControlEvents:UIControlEventTouchUpInside];
    }

    NSString *key = [NSString stringWithFormat:@"%d-%d", indexPath.row, indexPath.section];        
    if (openDict[key] && [openDict[key] boolValue]) {
        [sender setTitle:openStr forState:UIControlStateNormal];
    }
    else{
        [sender setTitle:closeStr forState:UIControlStateNormal];
    }

    cell.cellButton.tag = indexPath.row;
    return cell;
}

- (void)clickMe:(UIButton *)sender
{
    SViewTableViewCell *cell = (SViewTableViewCell *)[[sender superview]superview];
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    if (sender.tag == 0) {
        NSString *key = [NSString stringWithFormat:@"%d-%d", indexPath.row, indexPath.section];        
        if (openDict[key] && [openDict[key] boolValue]) {
             openDict[key] = @(0);
             [sender setTitle:closeStr forState:UIControlStateNormal];
        }
        else{
             openDict[key] = @(1);
             [sender setTitle:openStr forState:UIControlStateNormal];
        }
    }
}

Upvotes: 1

user189804
user189804

Reputation:

To add a button to a UITableViewCell you should do it at the time you configure the cell in cellForRowAtIndexPath - this is after you get the cell to reuse. If you want to add a button to a small number of cells you should cause that cell to be reloaded using UITableView's – reloadRowsAtIndexPaths:withRowAnimation: method or reloadData to give you the opportunity to reload all cells.

Any subview you add to a cell should be added to the cell's contentView as a subview. You should remove all such views in prepareForReuse or you could find cell reuse makes extra buttons appear in cells you don't want to have buttons. Because of the need to prepare cells for reuse it is probably best to subclass UITableViewCell and to provide methods on the subclass to add buttons.

Another way is to register multiple kinds of cells for reuse with the table view, choosing what kind of cell to retrieve and use based on the data backing your table view. This is as simple as using registerClass:forCellReuseIdentifier: once for each kind of cell, then applying right reuse identifier in dequeueReusableCellWithIdentifier:forIndexPath: - you'll still be subclassing the cell objects but you configure them further in the class rather than at the time they are dequeued.

Upvotes: 0

Related Questions