我有自己的TableViewCell
课程继承 UITableViewCell
。在我的单元格 nib 文件中,我已将图像放入TableViewCell
。 (图像不完全占据整个细胞区域,图像周围有空间)
然后,我想实现一个触摸反馈功能,当用户触摸单元格中的图像时,图像将被另一个图像替换。
我尝试在tableView:didSelectRowAtIndexPath:
方法中执行此操作:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//my TableViewCell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
//New image to replace the current one
UIImage* bg = [CCTheme imageNamed:@"green_btn_bg"];
UIImageView* bgView = [[UIImageView alloc] initWithImage:bg];
cell.selectedBackgroundView = bgView;
...
但它根本不起作用。那么,我该如何实现这种触摸反馈功能呢?当用户手指触摸单元格中的图像时,图像会变为另一个图像。
答案 0 :(得分:0)
didSelectRowAtIndexPath:
中,您必须先更改数据模型(指示单元格的状态已更改)。 cellForRowAtIndexPath:
。 (即,您检查状态是什么,并提供正确的图像。)reloadRowsAtIndexPaths:
。 <强>解释强>
您不应将单元格的状态存储在单元格的某个视图中。例如。如果不同的图像代表某种选择,那么提供表视图的数组或其他数据结构应该跟踪哪个行处于此状态。
每次必须重新生成单元格时,都会调用cellForRowAtIndexPath
。 (这可能是因为单元格变得可见,或者因为您明确更新它。)这是检查状态信息并相应显示单元格的最佳位置。
答案 1 :(得分:0)
在自定义UIImageView
类中创建UITableViewCell
属性IBOutlet
,然后在cellForRowAtIndexPath:
而不是背景属性上设置该属性上的图像。
cell.yourCustomImageView.image = bgView;
或者将UIImageView添加到当前的通用UITableViewCell中,如下所示。
使用当前单元格
[cell addSubview:bgView];
答案 2 :(得分:0)
我建议将手势识别器挂钩到自定义单元格的init方法中的UIImageView
:
// Add recognizer for tappable image
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(imageViewTapped:)];
[tapRecognizer setNumberOfTouchesRequired:1];
[tapRecognizer setDelegate:self];
self.tappableImageView.userInteractionEnabled = YES;
[self.tappableImageView addGestureRecognizer:tapRecognizer];
然后是处理程序:
- (void)imageViewTapped:(id)sender {
NSLog(@"image tapped");
self.tappableImageView.image = [UIImage imageNamed:@"some_different_image.png"];
}
另外,不要忘记让您自定义单元格声明:
@interface CustomTableViewCell : UITableViewCell <UIGestureRecognizerDelegate>
在cellForRowAtIndexPath:
方法中,您需要确保触发init方法中的代码,以便添加tapRecognizer
。
<强> [编辑] 强>
根据您使用自定义XIB创建单元格的方式,您可能不需要这样,但在我的情况下,我需要显式调用方法来初始化表格单元格中的UI状态。我这样做的方法是在自定义表格视图单元格上提供initState
方法:
- (void)initState {
// Do other things for state of the UI in table cell.
// Add recognizer for tappable image
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(imageViewTapped:)];
[tapRecognizer setNumberOfTouchesRequired:1];
[tapRecognizer setDelegate:self];
self.tappableImageView.userInteractionEnabled = YES;
[self.tappableImageView addGestureRecognizer:tapRecognizer];
}
然后在cellForRowAtIndexPath
中,我确保在创建表格单元格后调用initState
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
CustomTableViewCell *cell = (CustomTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"CustomTableViewCell" bundle:nil];
// Grab a pointer to the custom cell.
cell = (CustomTableViewCell *)temporaryController.view;
[cell initState];
}
return cell;
}