我的自定义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];
}
答案 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
的属性
然后在实现UITableViewDataSource
和UITableViewDelegate
方法的类(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
}