checkbox图像在UITableViewCell中切换

我需要一些关于创build一个UITableViewCell的指导,这个UITableViewCell在左边有一个可以切换的图像。 该图像应该是可点击的,并充当切换(checkbox)。

我正在努力的部分是:

  1. 如何检测图像上的水龙头,并处理这些不同的didSelectRowAtIndexPath?
  2. 如何在不执行[tableView reloadData]的情况下更改图像?

看到下面的图片样本:

替代文字http://img208.yfrog.com/img208/6119/screenshotkmr.png

谢谢

这其实很简单。

只要创build一个新的UIControl的子类,并把它放在那里(不需要一个单独的控制器)。我们称之为ToggleImageControl。

@interface ToggleImageControl : UIControl { BOOL selected; UIImageView *imageView; UIImage *normalImage; UIImage *selectedImage; } 

为每个单元格创build一个ToggleImageControl,并将其添加到适当的位置。

 ToggleImageControl *toggleControl = [[ToggleImageControl alloc] initWithFrame: <frame>]; toggleControl.tag = indexPath.row; // for reference in notifications. [cell.contentView addSubview: toggleControl]; 

添加一个UIImageView来包含图像。 添加触摸事件的目标。

 - (void) viewDidLoad { normalImage = [UIImage imageNamed: @"normal.png"]; selectedImage = [UIImage imageNamed: @"selected.png"]; imageView = [[UIImageView alloc] initWithImage: normalImage]; // set imageView frame [self.view addSubview: imageView]; [self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchUpInside]; } 

设置UIImageView的图像属性来更新图像; 这将触发重绘而没有副作用。

 - (void) toggleImage { selected = !selected; imageView.image = (selected ? selectedImage : normalImage); // Use NSNotification or other method to notify data model about state change. // Notification example: NSDictionary *dict = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: self.tag forKey: @"CellCheckToggled"]; [[NSNotificationCenter defaultCenter] postNotificationName: @"CellCheckToggled" object: self userInfo: dict]; } 

你显然需要按摩一些东西。 您可能想要传递两个图像名称以使其更加可重用,并且还build议从对象外部指定通知名称string(假设您正在使用通知方法)。

下面是我使用的“覆盖touchesBegan:”方法的实现,这很简单,似乎很好。

只需在你的项目中包含这个类,然后在tableView:cellForRowAtIndexPath:方法中创build并configuration一个TouchIconTableViewCell而不是UITableView单元格。

TouchIconTableViewCell.h:

 #import <UIKit/UIKit.h> @class TouchIconTableViewCell; @protocol TouchIconTableViewCellDelegate<NSObject> @required - (void)tableViewCellIconTouched:(TouchIconTableViewCell *)cell indexPath:(NSIndexPath *)indexPath; @end @interface TouchIconTableViewCell : UITableViewCell { id<TouchIconTableViewCellDelegate> touchIconDelegate; // note: not retained NSIndexPath *touchIconIndexPath; } @property (nonatomic, assign) id<TouchIconTableViewCellDelegate> touchIconDelegate; @property (nonatomic, retain) NSIndexPath *touchIconIndexPath; @end 

TouchIconTableViewCell.m:

 #import "TouchIconTableViewCell.h" @implementation TouchIconTableViewCell @synthesize touchIconDelegate; @synthesize touchIconIndexPath; - (void)dealloc { [touchIconIndexPath release]; [super dealloc]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint location = [((UITouch *)[touches anyObject]) locationInView:self]; if (CGRectContainsPoint(self.imageView.frame, location)) { [self.touchIconDelegate tableViewCellIconTouched:self indexPath:self.touchIconIndexPath]; return; } [super touchesBegan:touches withEvent:event]; } @end 

每次创build或重新使用单元格时,请设置touchIconDelegatetouchIconIndexPath属性。 当你的图标被触摸,委托将被调用。 然后你可以更新图标或任何。

所以“..显然需要按摩一些东西..”的意思是“…这个代码不起作用…”。

所以

 - (void) viewDidLoad 

应该

 - (id)initWithFrame:(CGRect)frame { if ( self = [super initWithFrame: frame] ){ normalImage = [UIImage imageNamed: @"toggleImageNormal.png"]; selectedImage = [UIImage imageNamed: @"toggleImageSelected.png"]; imageView = [[UIImageView alloc] initWithImage: normalImage]; // set imageView frame [self addSubview: imageView]; [self addTarget: self action: @selector(toggleImage) forControlEvents: UIControlEventTouchDown]; } return self; } 

因为- (void) viewDidLoad永远不会被调用。

从2011年10月12日起,苹果公司上传了“TableMultiSelect”作为iOS开发者计划的示例代码。

编辑模式下的多项select可以通过此代码启用。

 self.tableView.allowsMultipleSelectionDuringEditing = YES; 

http://developer.apple.com/library/ios/#samplecode/TableMultiSelect/Introduction/Intro.html

虽然它只能从iOS5使用。

几个小时,我无法在堆栈溢出find这个示例代码,所以我添加这个信息到这个职位。

有一个更简单的方法来做到这一点,如果你重写touchesBegan:你需要做一个if语句来决定它是否在检查标记的邻近范围内,如果它不是调用[super touchesBegan:touches withEvent:event] ,它会像它被选中。

我做了类似的事情(主演一个喜欢的),但是我认为你需要从iPhone用户的大拇指中进行很多的操作,而这个单元将人们引导到另一个视angular。 首先,我会查看单元格上的详细披露选项。 其中一个选项是您可以附加的预制箭头button。 你的来电。

你可能会赶上didSelectRowAtIndexPath事件,然后做一些其他的逻辑,而不是redirect,如果触摸是在你的checkbox,虽然我不知道你将如何得到的位置。 这意味着在调用didSelectRowAtIndexpath之前,您可能需要find一种方法来获取触摸事件,我不太清楚该如何操作。 你有没有处理touchesBegan之类的呢?