自定义UITableViewCell知道修改了哪个单元格的复选框

时间:2013-05-13 10:42:37

标签: ios uitableview

我有一个自定义单元格,有一个复选框,

一切正常,复选框根据我传递给我的子类UITableViewCell的字典进行检查,

但是现在我需要传递给具有表视图的类,我的复选框被修改的确切单元格,所以我可以为该特定单元格设置新的已检查或未选中状态的可变字典,

那么怎么做呢?,我应该使用委托吗?这很好,但问题是,我怎么知道修改了哪个单元格?

5 个答案:

答案 0 :(得分:4)

你可以使用像这样的代表......

MyCell.h

@protocol MyCellDelegate <NSObject>

-(void)cellCheckBoxWasChanged:(MyCell *)cell;

@end

@interface MyCell : NSObject

@property (nonatomic, weak) id <MyCellDelegate> delegate;

@end

MyCell.m

@implementation MyCell

- (void)checkBoxChanged
{
    [self.delegate cellCheckBoxWasChanged:self];
}

@end

然后找到你可以做的索引...

TableViewController.m

- (void)cellCheckBoxWasChanged:(MyCell *)cell
{
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    // do something to your array.
}

答案 1 :(得分:1)

为什么不将委托方法中的UITableViewCell作为self传递。

因此,使用该单元格,您可以通过

获取索引路径
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

答案 2 :(得分:1)

根据cellForRowAtIndexPath:方法中的单元格索引路径设置每个复选框的标记值。

   UIButton *checkboxes = customCell.checkButton
   [checkboxes setTag:indexPath.row];

然后按钮动作方法。

检查发件人。标签值以获得按下按钮的确切行

UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:sender.tag inSection:0]];

答案 3 :(得分:1)

你可以这样做 -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

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

 if([[[Usercontacts objectAtIndex:indexPath.row]objectForKey:@"isChecked"]isEqualToString:@"NO"])
        {
            [checkUncheckBtn setImage:[UIImage imageNamed:@"unchecked box.png" ]forState:UIControlStateNormal];
             checkUncheckBtn.tag=1; 
        }
        else
        {
            [checkUncheckBtn setImage:[UIImage imageNamed:@"checked box.png" ]forState:UIControlStateNormal];
              checkUncheckBtn.tag=2; 
        }
       [checkUncheckBtn addTarget:self action:@selector(checkUncheckBtnPressed:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

当您执行checkUncheckBtnPressed:方法时,它看起来像

-(void)checkUncheckBtnPressed:(id)sender
{

    UIButton *btn=(UIButton*)sender;
    UITableViewCell *cell =(UITableViewCell *) [sender superview] ;
    NSIndexPath *_indxpath = [createGroupContactsTableView indexPathForCell:cell];

    if(btn.tag==1)
    {
        [btn setImage:[UIImage imageNamed:@"checked box.png" ]forState:UIControlStateNormal];   
        btn.tag=2;
        [[Usercontacts objectAtIndex:_indxpath.row]setObject:@"YES" forKey:@"isChecked"];
    }
    else 
    {

        [btn setImage:[UIImage imageNamed:@"unchecked box.png" ]forState:UIControlStateNormal];   
         btn.tag=1;
        [[Usercontacts objectAtIndex:_indxpath.row]setObject:@"NO" forKey:@"isChecked"];

    }


}

答案 4 :(得分:1)

这是让单元格从checkBox中监听事件并使用委托模式将它们转发到UITableViewController的替代方法:

让UITableViewController监听来自checkBoxes的事件,并使用以下代码来确定单元格的NSIndexPath:

@implementation UITableView (MyCategory)

-(NSIndexPath*)indexPathOfCellComponent:(UIView*)component {
    if([component isDescendantOfView:self] && component != self) {
        CGPoint point = [component.superview convertPoint:component.center toView:self];
        return [self indexPathForRowAtPoint:point];
    }
    else {
        return nil;
    }
}
@end