0

我是IOS6开发新手。我遇到了问题UITableView。我下面的代码是在所选行的末尾显示复选标记。但是我收到了一个错误,比如“没有可见的@interfaceUITableView声明选择器cellForRowAtIndexPath:”。UITableViewcellForRowAtIndexPath方法,但 tableView 不能显示它。我不知道为什么。请帮忙。

下面是代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];   -----error line
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
  }

问题是“tableView”无法识别UITableView下的所有方法。它知道一些,例如“numberOfRowsInSection”。我不知道为什么。

4

2 回答 2

0

TableView 本身并没有实现这个选择器。此方法的完整选择器是

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

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

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

[tableView reloadData];
于 2013-06-04T10:28:39.107 回答
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. 您必须确定编译器为何对您当前的代码犹豫不决。

于 2013-06-04T14:10:10.373 回答