Ashish Agarwal
Ashish Agarwal

Reputation: 14925

Detect which button was clicked in a grouped UITableView

I have a grouped UITableView (this one has 4 sections) and several rows each. I have programatically created 2 buttons in each of the cells.

This is how I am creating the UITableViewCell. In this code, I am trying to detect the indexPath.row and the indexPath.section of the button that was pressed and pass it to the method. How am I able to do this ?

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellId = @"Cell";
    UITableViewCell *cell ;//= [tableView dequeueReusableCellWithIdentifier:nil];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}


NSString *docTitle = [currentDocument objectForKey:@"displayname"];

UIView *cellView = [[UIView alloc] initWithFrame:CGRectMake(cell.contentView.frame.origin.x+5, cell.contentView.frame.origin.y, cell.contentView.frame.size.width, cell.contentView.frame.size.height)];
UILabel *cellTitle = [[UILabel alloc] initWithFrame:CGRectMake(cellView.frame.origin.x + 5, cellView.frame.origin.y + 5, cellView.frame.size.width - 10, 25)];
cellTitle.backgroundColor = [UIColor clearColor];
cellTitle.text = docTitle;
[cellView addSubview:cellTitle];

[cell.contentView addSubview:cellView];

UIButton *viewDocumentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[viewDocumentButton setTitle:@"View Online" forState:UIControlStateNormal];
viewDocumentButton.frame = CGRectMake(cellView.frame.origin.x + 5,       cellTitle.frame.origin.y + cellTitle.frame.size.height + 5, 150, 35);
[viewDocumentButton addTarget:self action:@selector(openDocumentButtonPressedMethod:) forControlEvents:UIControlEventTouchDown];
[viewDocumentButton setTag:indexPath.row];
[cell.contentView addSubview:viewDocumentButton];

UIButton *downloadDocumentButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadDocumentButton setTitle:@"Download Document" forState:UIControlStateNormal];
downloadDocumentButton.frame = CGRectMake(cellView.frame.origin.x + 5, viewDocumentButton.frame.origin.y + viewDocumentButton.frame.size.height + 5, 150, 35);
[downloadDocumentButton addTarget:self action:@selector(openDocumentButtonPressedMethod:) forControlEvents:UIControlEventTouchDown];
[downloadDocumentButton setTag:indexPath.row];
[cell.contentView addSubview:downloadDocumentButton];

cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;  
}

Upvotes: 0

Views: 1667

Answers (3)

Michael Reneer
Michael Reneer

Reputation: 2601

Additionally, you could...

- (IBAction)openDocumentButtonPressedMethod:(id)sender {
    UIButton *button = (UIButton *)sender;
    UIView *contentView = button.superview;
    UITableViewCell *cell = (UITableViewCell *)contentView.superview;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    // do something with the indexPath
}

And if you wanted to use the same method to handle both button events, then you could use the tag on the button to distinguish between the two buttons.

if (button.tag == 1) {
    // do something with the indexPath view related
}
else {
    // do something with the indexPath download related
}

Upvotes: 4

fumoboy007
fumoboy007

Reputation: 5553

In your openDocumentButtonPressedMethod: method, do

CGPoint pointInTableView = [self.tableView convertPoint:sender.bounds.origin fromView:sender];

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:pointInTableView];

Upvotes: 0

GoZoner
GoZoner

Reputation: 70235

Create a subclass of UIButton

@interface MyButton : UIButton 
{ /* indexPath, other stuff */ }
@end

Then implement

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

to do something with the indexPath and other stuff before invoking the super for this method.

When you create the button, provide indexPath.

Upvotes: 0

Related Questions