我正在尝试创建一个UITableView,当用户选择一个单元格时,它会显示一个复选标记,如果用户选择了一个不同的单元格,它会删除先前选中的单元格的复选标记,并将复选标记放在新选择的单元格上。我在网上搜索过但是没有好的例子可以实际工作。 Apple有一些示例代码位于here,它解释并完成了我想要做的事情,但当我将其复制并粘贴到我的项目中时,我会收到错误。我试图修复错误,但Apple遗漏了一些声明或其他东西。我现在收到的唯一一个我似乎无法解决的错误是self.currentCategory不是一个对象而且找不到。所以我的问题是如何修复Apple的代码以使其工作?有人可以为我声明/解释所有遗失的部分吗?这是Apple的代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
NSInteger catIndex = [taskCategories indexOfObject:self.currentCategory];
if (catIndex == indexPath.row) {
return;
}
NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:catIndex inSection:0];
UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
if (newCell.accessoryType == UITableViewCellAccessoryNone) {
newCell.accessoryType = UITableViewCellAccessoryCheckmark;
self.currentCategory = [taskCategories objectAtIndex:indexPath.row];
}
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:oldIndexPath];
if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) {
oldCell.accessoryType = UITableViewCellAccessoryNone;
}
}
答案 0 :(得分:1)
那里有一两件丢失的碎片。从我所看到的,你需要把
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
在代码运行之前的文件顶部,然后在类中声明几个实例变量:
@interface myClass
{
MyCustomCategoryClass *currentCategory; // pointer to the currently checked item
NSArray *taskCategories; // pointer to an array of your list items
... // other instance variables here
}
... // other @property declarations here or in your .m file
@property (assign) MyCustomCategoryClass *currentCategory;
@property (retain) NSArray *taskCategories;
MyCustomCategoryClass
可以是您喜欢的任何自定义类,但这是您的用户之间的选择。如果你愿意,它甚至可以只是一个NSString
。我对assign
说currentCategory
,因为那不是指向项目所有权的指针,拥有的引用应该在数组中(retain
编辑)。您也可以将taskCategories
设为@property(nonatomic, retain)
,但我可能会将currentCategory
保留为atomic
(默认设置),以防万一您正在更改想要阅读用户选择的内容。
哦,不要忘记在允许用户从列表中选择之前用taskCategories
填充项目。
答案 1 :(得分:0)
@property (nonatomic,retain) NSIndexPath *oldIndexPath;
@synthesize oldIndexPath;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:self.oldIndexPath];
if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) {
oldCell.accessoryType = UITableViewCellAccessoryNone;
}
cell.accessoryType = UITableViewCellAccessoryCheckmark;
self.oldIndexPath = indexPath;
} else if(cell.accessoryType == UITableViewCellAccessoryCheckmark){
UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:self.oldIndexPath];
if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) {
oldCell.accessoryType = UITableViewCellAccessoryNone;
}
cell.accessoryType = UITableViewCellAccessoryNone;
self.oldIndexPath = indexPath;
}//cell acctype
}