“UITableView”没有可见的@interface声明选择器“cellForRowAtIndexPath:”

时间:2013-06-04 04:15:29

标签: ios objective-c uitableview

我是IOS6 dev的新手。我遇到了UITableView的问题。我的下面的代码是在所选行的末尾显示复选标记。但是我收到了一条错误,例如“UITableView cellForRowAtIndexPath:无法显示 @interface ,表示选择器UITableView”。 cellForRowAtIndexPath- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; -----error line cell.accessoryType = UITableViewCellAccessoryCheckmark; } 方法,但tableView不能 展示下。我不知道为什么。请帮忙。

以下是代码:

{{1}}

问题是“tableView”无法识别UITableView下的所有方法。有些人知道如“numberOfRowsInSection”。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:0)

TableView本身不实现此选择器。 此方法的完整选择器是

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

,来自代表的协议。您的委托(例如viewController)必须实现此方法。不建议(并且不容易)从表中获取单元格对象。

相反,更改基础数据并使用

重绘表格
[tableView reloadData];

答案 1 :(得分:0)

您的问题不在您提供的代码示例中。你的问题在其他地方。我们无法在这一个片段的基础上诊断出问题。您必须与我们分享更完整的代码示例。


与您的问题无关,您的didSelectRowAtIndexPath中存在一个微妙的问题。你不应该只是在这里更新cellAccessoryType。您真的应该更新支持UI的模型。如果表格中的行数多于在任何给定时刻可见的行数,那么这将是至关重要的。

为了说明这个想法,让我们假设你的模型是一个具有两个属性的对象数组,即单元格的title以及单元格是否为selected

因此,您的cellForRowAtIndexPath可能如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    RowData *rowObject = self.objects[indexPath.row];
    cell.textLabel.text = rowObject.title;

    if (rowObject.isSelected)
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    else
        cell.accessoryType = UITableViewCellAccessoryNone;

    return cell;
}

您的didSelectRowAtIndexPath可能如下:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    RowData *rowObject = self.objects[indexPath.row];
    rowObject.selected = !rowObject.isSelected;

    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

同样,您的编译器警告/错误无疑源于源代码中的其他一些问题,因为您的原始代码段在语法上是正确的。我只是想纠正你didSelectRowAtIndexPath中的另一个缺陷。在MVC编程中,您确实希望确保更新模型(然后更新视图),而不仅仅是更新视图。

但是,要明确的是,如果您没有更正导致当前编译器警告/错误的错误,那么无论您将哪些内容放入didSelectRowAtIndexPath,您都可能会收到另一个警告。你必须确定编译器为什么会在你当前的代码中徘徊。