0

我正在使用 indexPath.row 确定我在 tableview 的哪一行做某事。我的单元格的标题包含一个数字,第一行应该是 1,最后一行应该是 18,所以我有 18 行。这适用于前 11 行,但在那之后,标题中的数字似乎是随机生成的!有时是 16,然后是 5,然后是 18,然后是 12……等等。它有什么问题/为什么 indexPath.row 变量会这样?

我的 cellForRowAtIndexPath 方法:

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

static NSString *MyIdentifier = @"MyIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil];
    cell = cell0;
    self.cell0 = nil;
}
UILabel *label;
label = (UILabel *)[cell viewWithTag:1];
label.text = [NSString stringWithFormat:@"Cell %d", indexPath.row];

return cell;  

}

关于如何解决问题的更多建议?我直到现在才让它工作......

// 更新更多代码:

这是我声明单元格的方式。它位于一个 XIB 文件(模板“空 XIB”)中,我只是将库中的单元格放入 IB 中。

@interface myViewController : UITableViewController {

    UITableViewCell *cell0;
}

@property (nonatomic, retain) IBOutlet UITableViewCell *cell0;

然后,在 myViewController.m 文件的顶部:

@synthesize cell0;

我的 cellForRowAtIndexPath 方法已经在上面发布了。它等同于 SDK 文档中的 cellForRowAtIndexPath 方法,在 Apple 的示例中,它似乎可以工作。

4

5 回答 5

1

你想用cell0完成什么?

cell = cell0;
self.cell0 = nil;

看起来您正在创建一个新单元格,但不知何故决定使用旧单元格。真正的罪魁祸首看起来像加载单元格的代码实际上被分配到任何地方。

试试这个:

if (cell == nil) {
    cell = [[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil];
}

也许:

if (cell == nil)
{
     // TODO: try to avoid view controller
     UIViewController *vc = [[UIViewController alloc] initWithNibName:@"IndividualContractWithResult" bundle:nil];
     cell = (IndividualContractWithResult_Cell *) vc.view;
     [vc release];
}
于 2009-11-11T23:55:30.497 回答
0

您似乎在这里错误地访问了一个属性:

cell = cell0;
self.cell0 = nil;

假设您有一个名为 cell0 的实例变量,通过将其设置为 nil,您可能会在准备好使用它之前释放它。

正确的方法是:

cell = self.cell0;
self.cell0 = nil;

这样,如果cell0被声明为retain,你会自动得到一个自动释放的cell0,而如果你直接引用cell0(没有self。),你会得到一个未保留的引用,当self.cell0 = nil时它会消失叫。

在这里使用基于 nib 的单元格的优点是您可以使用 outlet 而不是标签来识别子视图。您已经完成了繁重的工作,您可能只想添加一个插座和子类 UITableViewCell 来访问标签。

于 2009-11-26T15:01:20.533 回答
0

您将需要保留和自动释放 cell0,否则当您设置 时self.cell0 = nilcell0没有已知的引用。

cell = [[cell0 retain] autorelease];
self.cell0 = nil;

你也可以这样做:

cell = self.cell0;
self.cell0 = nil;

.. 因为任何retain属性都应该使用保留/自动释放模式来实现它们的吸气剂。

于 2009-11-26T15:10:29.773 回答
0

如果您提供为表格视图创建单元格的代码,将会更容易回答。
重用单元格似乎存在问题 - 您重用以前创建的单元格而没有为其设置新值。

于 2009-11-11T11:45:33.057 回答
0

听起来您不是在重复使用单元格,而是在有可用单元格时创建新单元格。查看 dequeueReusableCellWithIdentifier 的示例代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"MyCell"] autorelease];
    }

    cell.text = <your code here>;
    return cell;
}
于 2009-11-11T11:58:46.490 回答