How to use Reusable Cells in uitableview for IOS

后端 未结 6 1555
日久生厌
日久生厌 2020-12-09 05:57

Ok. I cant seem to get a firm understanding on how tableviews work. Would someone please explain to me how cells are reused in tableviews especially when scrolling? One of t

6条回答
  •  孤城傲影
    2020-12-09 06:54

    I am assuming you are doing this via Storyboard and since you haven't created your button via the Interface Builder, you need to check if the cell that is being re-used already has the button or not.
    As per your current logic, you are creating a new button instance ever time the cell reappears.

    I'd suggest the following:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
        //following is required when using XIB but not needed when using Storyboard
        /*
         if (cell == nil) {
             cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
         }
         */
        //Reason:
        //[1] When using XIB, dequeueReusableCellWithIdentifier does NOT create a cell so (cell == nil) condition occurs
        //[2] When using Storyboard, dequeueReusableCellWithIdentifier DOES create a cell and so (cell == nil) condition never occurs
    
        //check if cell is being reused by checking if the button already exists in it
        UIButton *myButton = (UIButton *)[cell.contentView viewWithTag:100];
    
        if (myButton == nil) {
            myButton = [UIButton buttonWithType:UIButtonTypeCustom];
            [myButton setFrame:CGRectMake(14.0,10.0,125.0,25.0)];
            [myButton setTag:100]; //the tag is what helps in the first step
            [myButton setTitle:@"Like" forState:UIControlStateNormal];
            [myButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
            [myButton addTarget:self action:@selector(tapped:andEvent:) forControlEvents:UIControlEventTouchUpInside];
            [cell.contentView addSubview:myButton];
    
            NSLog(@"Button created");
        }
        else {
            NSLog(@"Button already created");
        }
    
        if ([likeState[indexPath.row] boolValue]) {
            [myButton setTitle:@"Unlike" forState:UIControlStateNormal];
        }
        else {
            [myButton setTitle:@"Like" forState:UIControlStateNormal];
        }
    
        return cell;
    }
    

    -(void)tapped:(UIButton *)sender andEvent:(UIEvent *)event
    {
        //get index
        NSSet *touches = [event allTouches];
        UITouch *touch = [touches anyObject];
        CGPoint currentTouchPosition = [touch locationInView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:currentTouchPosition];
    
        //toggle "like" status
        if ([likeState[indexPath.row] boolValue]) {
            [likeState replaceObjectAtIndex:indexPath.row withObject:@(0)];
            [sender setTitle:@"Like" forState:UIControlStateNormal];
        }
        else {
            [likeState replaceObjectAtIndex:indexPath.row withObject:@(1)];
            [sender setTitle:@"Unlike" forState:UIControlStateNormal];
        }
    }
    

提交回复
热议问题