Detecting which UIButton was pressed in a UITableView

前端 未结 26 3426
小蘑菇
小蘑菇 2020-11-22 00:40

I have a UITableView with 5 UITableViewCells. Each cell contains a UIButton which is set up as follows:

- (UITableView         


        
26条回答
  •  生来不讨喜
    2020-11-22 00:55

    TO HANDLE SECTIONS - I stored the NSIndexPath in a custom UITableViewCell

    IN CLKIndexPricesHEADERTableViewCell.xib

    IN IB Add UIButton to XIB - DONT add action!

    Add outlet @property (retain, nonatomic) IBOutlet UIButton *buttonIndexSectionClose;

    DO NOT CTRL+DRAG an action in IB(done in code below)

    @interface CLKIndexPricesHEADERTableViewCell : UITableViewCell
    ...
    @property (retain, nonatomic) IBOutlet UIButton *buttonIndexSectionClose;
    @property (nonatomic, retain) NSIndexPath * indexPathForCell;
    @end
    

    In viewForHeaderInSection (should also work for cellForRow.... etc if you table has only 1 section)

    - viewForHeaderInSection is called for each section 1...2...3
    - get the cell CLKIndexPricesHEADERTableViewCell 
    - getTableRowHEADER just does the normal dequeueReusableCellWithIdentifier
    - STORE the indexPath IN the UITableView cell
    - indexPath.section = (NSInteger)section
    - indexPath.row = 0 always (we are only interested in sections)
    
    - (UIView *) tableView:(UITableView *)tableView1 viewForHeaderInSection:(NSInteger)section {
    
    
        //Standard method for getting a UITableViewCell
        CLKIndexPricesHEADERTableViewCell * cellHEADER = [self getTableRowHEADER];
    

    ...use the section to get data for your cell

    ...fill it in

       indexName        = ffaIndex.routeCode;
       indexPrice       = ffaIndex.indexValue;
    
       //
    
       [cellHEADER.buttonIndexSectionClose addTarget:self
                                              action:@selector(buttonDELETEINDEXPressedAction:forEvent:)
                                    forControlEvents:UIControlEventTouchUpInside];
    
    
       cellHEADER.indexPathForCell = [NSIndexPath indexPathForRow:0 inSection:section];
    
    
        return cellHEADER;
    }
    

    USER presses DELETE Button on a Section header and this calls

    - (void)buttonDELETEINDEXPressedAction:(id)sender forEvent:(UIEvent *)event
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    
    
        UIView *  parent1 = [sender superview];   // UiTableViewCellContentView
        //UIView *myContentView = (UIView *)parent1;
    
        UIView *  parent2 = [parent1 superview];  // custom cell containing the content view
        //UIView *  parent3 = [parent2 superview];  // UITableView containing the cell
        //UIView *  parent4 = [parent3 superview];  // UIView containing the table
    
    
        if([parent2 isMemberOfClass:[CLKIndexPricesHEADERTableViewCell class]]){
            CLKIndexPricesHEADERTableViewCell *myTableCell = (CLKIndexPricesHEADERTableViewCell *)parent2;
    
            //UITableView *myTable = (UITableView *)parent3;
            //UIView *mainView = (UIView *)parent4;
    
            NSLog(@"%s indexPath.section,row[%d,%d]", __PRETTY_FUNCTION__, myTableCell.indexPathForCell.section,myTableCell.indexPathForCell.row);
    
            NSString *key = [self.sortedKeysArray objectAtIndex:myTableCell.indexPathForCell.section];
            if(key){
                NSLog(@"%s DELETE object at key:%@", __PRETTY_FUNCTION__,key);
                self.keyForSectionIndexToDelete = key;
                self.sectionIndexToDelete = myTableCell.indexPathForCell.section;
    
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Remove Index"
                                                                    message:@"Are you sure"
                                                                   delegate:self
                                                          cancelButtonTitle:@"No"
                                                          otherButtonTitles:@"Yes", nil];
                alertView.tag = kALERTVIEW_REMOVE_ONE_INDEX;
                [alertView show];
                [alertView release];
                //------
            }else{
                NSLog(@"ERROR: [%s] key is nil for section:%d", __PRETTY_FUNCTION__,myTableCell.indexPathForCell.section);
            }
    
        }else{
            NSLog(@"ERROR: [%s] CLKIndexPricesHEADERTableViewCell not found", __PRETTY_FUNCTION__);
        }
    }
    

    In this example I added a Delete button so should show UIAlertView to confirm it

    I store the section and key into the dictionary storing info about the section in a ivar in the VC

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
       if(alertView.tag == kALERTVIEW_REMOVE_ONE_INDEX){
            if(buttonIndex==0){
                //NO
                NSLog(@"[%s] BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
                //do nothing
            }
            else if(buttonIndex==1){
                //YES
                NSLog(@"[%s] BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
                if(self.keyForSectionIndexToDelete != nil){
    
                    //Remove the section by key
                    [self.indexPricesDictionary removeObjectForKey:self.keyForSectionIndexToDelete];
    
                    //sort the keys so sections appear alphabetically/numbericsearch (minus the one we just removed)
                    [self updateTheSortedKeysArray];                
    
                    //Delete the section from the table using animation
                    [self.tableView beginUpdates];
    
                    [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:self.sectionIndexToDelete]
                                  withRowAnimation:UITableViewRowAnimationAutomatic];
                    [self.tableView endUpdates];
    
                    //required to trigger refresh of myTableCell.indexPathForCell else old values in UITableViewCells
                    [self.tableView reloadData];
                }else{
                    NSLog(@"ERROR: [%s] OBJECT is nil", __PRETTY_FUNCTION__);
                }
            }
            else {
                NSLog(@"ERROR: [%s] UNHANDLED BUTTON:%d", __PRETTY_FUNCTION__,buttonIndex);
            }
        }else {
            NSLog(@"ERROR: [%s] unhandled ALERTVIEW TAG:%d", __PRETTY_FUNCTION__,alertView.tag);
        }
    }
    

提交回复
热议问题