How to create a toolbar between UITableView rows

前端 未结 6 1722
终归单人心
终归单人心 2020-12-12 09:05

I am interested on how tweetbot does the following:

\"Enter

I would like to cr

6条回答
  •  心在旅途
    2020-12-12 10:07

    The best way to do this is to add a dummy cell below the cell that was tapped.

    First you need to keep track of what cell is been tapped and act accordingly.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
    
        //if user tapped the same row twice let's start getting rid of the control cell
        if([indexPath isEqual:self.tappedIndexPath]){
            [tableView deselectRowAtIndexPath:indexPath animated:NO];
        }
    
        //update the indexpath if needed... I explain this below 
        indexPath = [self modelIndexPathforIndexPath:indexPath];
    
        //pointer to delete the control cell
        NSIndexPath *indexPathToDelete = self.controlRowIndexPath;
    
        //if in fact I tapped the same row twice lets clear our tapping trackers 
        if([indexPath isEqual:self.tappedIndexPath]){
            self.tappedIndexPath = nil;
            self.controlRowIndexPath = nil;
        }
        //otherwise let's update them appropriately 
        else{
            self.tappedIndexPath = indexPath; //the row the user just tapped. 
            //Now I set the location of where I need to add the dummy cell 
            self.controlRowIndexPath = [NSIndexPath indexPathForRow:indexPath.row + 1   inSection:indexPath.section];
        }
    
        //all logic is done, lets start updating the table
        [tableView beginUpdates];
    
        //lets delete the control cell, either the user tapped the same row twice or tapped another row
        if(indexPathToDelete){
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPathToDelete] 
                              withRowAnimation:UITableViewRowAnimationNone];
        }
        //lets add the new control cell in the right place 
        if(self.controlRowIndexPath){
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:self.controlRowIndexPath] 
                              withRowAnimation:UITableViewRowAnimationNone];
        }
    
        //and we are done... 
        [tableView endUpdates];  
    } 
    

    Whenever you have that dummy cell present you have to make sure to send the correct count.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        if(self.controlRowIndexPath){
            return modelArray.count + 1;
        }
        return self.modelArray.count;
    }
    

    Also, return the appropriate height for your ControlCell.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath   *)indexPath 
    {
        if([indexPath isEqual:self.controlRowIndexPath]){
            return 45; //height for control cell
        }
        return 70; //height for every other cell 
    }
    

    Lastly, remember the control cell is a dummy. Is not part of the model, thus you have to account for that. If the user taps a row that is above the last tapped row is ok but when the new tapped row is below that control cell you have to make sure you access the right row in your model. In other words, account for that fake cell in the middle of your view.

    - (NSIndexPath *)modelIndexPathforIndexPath:(NSIndexPath *)indexPath
    {
        int whereIsTheControlRow = self.controlRowIndexPath.row;
        if(self.controlRowIndexPath != nil && indexPath.row > whereIsTheControlRow)
            return [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:0]; 
        return indexPath;
    }
    

    I hope this helps.

提交回复
热议问题