iPhone桌面视图 - 问题indexPath.row

问题描述:

我正在使用indexPath.row确定在我的tableview的哪一行我做了一些事情。我的单元格的标题包含一个数字,第一行应该是1,最后一行应该是18,所以我有18行。这适用于前11行,但之后,我在标题中有数字,似乎是随机生成的!有时候是16,然后是5,然后是18,然后是12 ...等等。 它有什么问题/为什么indexPath.row变量的行为如此?iPhone桌面视图 - 问题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的例子中,它似乎工作。

+0

发表您的cellForRowAtIndexPath:方法。 – Morion 2009-11-11 11:48:20

+0

我在第一篇文章中加入了它。 – iYassin 2009-11-11 12:14:29

+0

可以验证标记=(的UILabel *)[细胞viewWithTag:1];实际上会返回一些东西,即标签!= nil?如果不是零,你能否检查你是否真的获得了UILabel?或者使用不同的标签(高数)尝试 – 2009-11-12 00:07:28

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

听起来好像你不是在重新使用细胞,而是在细胞可用时创建新细胞。查看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; 
} 
+0

我上面的帖子张贴了我的cellForRowAtIndexPath方法。我尝试添加了 “电池= [[[UITableViewCell的页头] initWithFrame:方法CGRectZero reuseIdentifier:@” 了myCell “]自动释放]; ” 行到我的代码,但它什么也没有改变。 – iYassin 2009-11-11 23:05:03

你想用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]; 
} 
+0

这并没有真正的工作,它会发出警告“不兼容的Objective-C型分配‘结构的NSArray *’,预期‘结构的UITableViewCell *’”,如果我访问视图,应用程序会马上闭合。 – iYassin 2009-11-12 08:04:16

+0

对不起,我再次访问我的代码。其中我使用外部NIB来加载我的单元格。我将在上面添加它,以便格式化。 – 2009-11-12 14:18:27

+0

我看到cell0现在来自哪里。你应该重新加载整个NIB,以获得一个新的cell0,然后将其用作你的cell。我想知道你是否因内存不足而导致这些早期的抢夺被释放。然后它们被重用于以后的元素。 – 2009-11-12 14:23:06

这似乎是你没有正确地访问此属性:

cell = cell0; 
self.cell0 = nil; 

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

正确的方式做,这就是:

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

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

这里使用基于笔尖电池的好处是,你可以用网点,而不是标签,以识别子视图。您已经完成了繁重的工作,您可能需要添加一个插座和UITableViewCell的子类以访问标签。

+0

- >插座/标签:是的,但我已经从单一的自定义单元格中创建18行,我想访问一个特定的标签,在一个特定的细胞,所以我不能使用的网点,对不对? - > CELL0/self.cell0:这也没有工作... – iYassin 2009-11-28 20:18:07

+0

目前还不清楚是什么CELL0。它是一个实例变量?如果它是一个财产(它似乎是),它是如何申报的?保留还是分配?没有看到你的代码的其余部分,我不能确定,但​​我认为你重新使用你的单元格的方式有些不妥。 – 2009-11-28 21:52:47

+0

CELL0是的UITableViewCell在我的视图控制器的头文件中声明,我把它分配给我的手机(这是一个空XIB文件)的IB。它在.h文件中声明为@property(nonatomic,retain)UITableViewCell ...。 – iYassin 2009-11-30 17:24:49

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

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

你也可以这样做:

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

..由于任何retain性能应实现他们的保留/自动释放模式干将。

+0

两者都没有工作... – iYassin 2009-11-28 20:24:14

+0

查看我编辑的另一种方法... – Jason 2009-11-28 23:28:35

+0

我在上面添加了更多的代码...我想我应该用您的代码中的“MyViewController”替换我的视图控制器的名称?我这样做了,它确实使我的应用程序退出,因为我访问视图。这可能是一个问题,我的单元格是在一个额外的空XIB文件? – iYassin 2009-12-01 17:08:33