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的例子中,它似乎工作。
如果您将代码放置在为表格视图创建单元格的位置,将更容易回答。
它看起来有重复使用单元格的问题 - 您可以重新使用以前创建的单元格而不设置新值。
听起来好像你不是在重新使用细胞,而是在细胞可用时创建新细胞。查看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;
}
我上面的帖子张贴了我的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];
}
这并没有真正的工作,它会发出警告“不兼容的Objective-C型分配‘结构的NSArray *’,预期‘结构的UITableViewCell *’”,如果我访问视图,应用程序会马上闭合。 – iYassin 2009-11-12 08:04:16
对不起,我再次访问我的代码。其中我使用外部NIB来加载我的单元格。我将在上面添加它,以便格式化。 – 2009-11-12 14:18:27
我看到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的子类以访问标签。
- >插座/标签:是的,但我已经从单一的自定义单元格中创建18行,我想访问一个特定的标签,在一个特定的细胞,所以我不能使用的网点,对不对? - > CELL0/self.cell0:这也没有工作... – iYassin 2009-11-28 20:18:07
目前还不清楚是什么CELL0。它是一个实例变量?如果它是一个财产(它似乎是),它是如何申报的?保留还是分配?没有看到你的代码的其余部分,我不能确定,但我认为你重新使用你的单元格的方式有些不妥。 – 2009-11-28 21:52:47
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
性能应实现他们的保留/自动释放模式干将。
发表您的cellForRowAtIndexPath:方法。 – Morion 2009-11-11 11:48:20
我在第一篇文章中加入了它。 – iYassin 2009-11-11 12:14:29
可以验证标记=(的UILabel *)[细胞viewWithTag:1];实际上会返回一些东西,即标签!= nil?如果不是零,你能否检查你是否真的获得了UILabel?或者使用不同的标签(高数)尝试 – 2009-11-12 00:07:28