iPhone表视图 - indexPath.row的问题

时间:2009-11-11 11:40:19

标签: iphone path indexing tableview

我正在使用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的示例中,它似乎有效。

5 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

如果您为表格视图创建单元格的代码,则更容易回答。
看起来重用单元格存在问题 - 您重复使用以前创建的单元格而不为其设置新值。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

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

cell = cell0;
self.cell0 = nil;

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

这样做的正确方法是:

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

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

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

答案 4 :(得分:0)

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

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

你也可以这样做:

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

..因为任何retain属性都应该使用retain / autorelease模式实现其getter。