我有一个带有复选框的自定义单元格,
一切正常,复选框根据我传递给我的子类 UITableViewCell 的字典进行检查,
但现在我需要将我的复选框已修改的确切单元格传递给具有表格视图的类,以便我可以将可变字典设置为该特定单元格的新选中或未选中状态,
那么该怎么做呢?我应该使用委托吗?这很好,但问题是,我怎么知道我的复选框在哪个单元格上被修改了?
我有一个带有复选框的自定义单元格,
一切正常,复选框根据我传递给我的子类 UITableViewCell 的字典进行检查,
但现在我需要将我的复选框已修改的确切单元格传递给具有表格视图的类,以便我可以将可变字典设置为该特定单元格的新选中或未选中状态,
那么该怎么做呢?我应该使用委托吗?这很好,但问题是,我怎么知道我的复选框在哪个单元格上被修改了?
您可以使用这样的委托...
MyCell.h
@protocol MyCellDelegate <NSObject>
-(void)cellCheckBoxWasChanged:(MyCell *)cell;
@end
@interface MyCell : NSObject
@property (nonatomic, weak) id <MyCellDelegate> delegate;
@end
我的细胞
@implementation MyCell
- (void)checkBoxChanged
{
[self.delegate cellCheckBoxWasChanged:self];
}
@end
然后找到你可以做的索引......
表视图控制器.m
- (void)cellCheckBoxWasChanged:(MyCell *)cell
{
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
// do something to your array.
}
你可以这样做 -
-(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"];
}
}
为什么不在委托方法中将 UITableViewCell 也传递为self
.
因此,使用该单元格,您可以通过
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
根据cellForRowAtIndexPath:
方法中的单元格索引路径设置每个复选框的标记值。
UIButton *checkboxes = customCell.checkButton
[checkboxes setTag:indexPath.row];
然后在按钮操作方法中。
检查 senders.Tag 值以获取按下按钮的确切行
UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:sender.tag inSection:0]];
这是让 Cells 监听来自复选框的事件并使用委托模式将它们转发到 UITableViewController 的替代方法:
让 UITableViewController 监听来自复选框的事件并使用以下代码来确定单元格的 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