Obj-C - 如果轻触custon tableview单元格中的按钮,则删除tableview行

时间:2017-11-04 17:49:35

标签: ios objective-c uitableview

我的自定义tableview单元格中有一个复选标记按钮。在我的tableview中点击该按钮时,我希望删除该行。

现在,如果单元格本身被点击,下面的代码会删除该行,但如果单击该单元格内的按钮则不会删除该行。我怎样才能使得如果单击单元格内的按钮,该行会删除?

ViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (tableView == self.sidetableView) {

        NSMutableDictionary *nodeData = [[self.myFriendData objectAtIndex:indexPath.row] mutableCopy];

        NSString *nid = [nodeData objectForKey:@"nid"];
        [nodeData setObject:nid forKey:@"nid"];

        [self.myFriendData removeObjectAtIndex:indexPath.row];

        [DIOSNode nodeDelete:nodeData success:^(AFHTTPRequestOperation *operation, id responseObject) {

            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

            NSLog(@"node deleted!");
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"could not delete node!");
        }];


    }

CustomTableViewCell.m

-(void)accepted {

    NSString *friendAccepted = @"friendAccepted";
    [[NSUserDefaults standardUserDefaults] setObject:friendAccepted forKey:@"friendStatus"];
    [[NSUserDefaults standardUserDefaults] synchronize];

}

-(void)alreadyAccepted {

    NSString *savedValue = [[NSUserDefaults standardUserDefaults]
                            stringForKey:@"friendStatus"];
    NSString *accepted = savedValue;

    if (savedValue == NULL){


    } else {



        self.acceptFriend.userInteractionEnabled = NO;
        [self.acceptFriend setImage:[UIImage imageNamed:@"checkedgreen.png"] forState:UIControlStateNormal];


    }
}


- (IBAction)acceptFriend:(id)sender {

    [self alreadyAccepted];
    [self accepted];

        [self.acceptFriend setImage:[UIImage imageNamed:@"checkedgreen.png"] forState:UIControlStateNormal];

}

2 个答案:

答案 0 :(得分:1)

我可以大致了解如何以一种方式实现这一目标。

在单元格类中声明按钮的出口

@property (nonatomic, retain) IBOutlet UIButton *deleteButton;

cellForRowAtIndexPath datasource中的下一步将目标按钮分配给ViewController内的某个功能。同时将tag分配给此按钮。

在此函数的操作中放入代码和逻辑,用于从模型/数据源中删除数据并重新加载tableView。

请参阅this link,为ViewController中的按钮分配操作。希望这会有所帮助。

代码段

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"SimpleTableItem";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
    cell.myButton.tag = indexPath.row
    [cell.myButton addTarget:self 
             action:@selector(myAction) 
   forControlEvents:UIControlEventTouchUpInside];
        return cell;
    }

答案 1 :(得分:0)

我认为一种方法是使用delegate模式来解决这个问题。

首先在UITableViewCell子类中创建一个委托。

@protocol CellCalssDelegate <NSObject>

- (void)deleteCellForIndexPath:(NSIndexPath *)indexPath;

@end

@interface MyCellSubclass: UITableViewCell
@property (nonatomic, weak) id <CellCalssDelegate > delegate;

@end

其次从故事板中的此单元格内的按钮添加IBAction。

-(IBAction) deleteButtonTapped: (UIButton *)button; {

             [self.delegate deleteCellForIndexPath: self.indexPath];

}

然后在您的单元格类中创建indexPath的属性

然后在实现UITableViewDataSourceUITableViewDelegate方法的类(ViewController)中。

ViewContrller.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      ....  
      cell.delegate = self;

      cell.indexPath = indexPath;

     ...
     return cell;
}

//CellDelegate Method...
-(void) deleteCellForIndexPath:(NSIndexPath)indexPath; {

        //write your logic for deleting the cell

}