如何为复选标记创建一个独有的UITableView列表?

时间:2011-04-08 00:58:20

标签: iphone objective-c cocoa-touch uitableview uikit

我正在尝试创建一个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;
    }
}

2 个答案:

答案 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。我对assigncurrentCategory,因为那不是指向项目所有权的指针,拥有的引用应该在数组中(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

}