UITableView自定义单元格重置单元格内容

时间:2009-07-20 17:17:15

标签: iphone uitableview

好吧,我知道我遇到了关于objective-c,cocoa,xcode和blah blah等的理解极限。但这就是我要做的事情:

我在viewcontroller中有一个tableview。 tableview的委托是viewcontroller。 Viewcontroller有一个桌面视图的出口。该表使用自定义单元格(带有IB xib)和来自xml文件的数据放在一起。在自定义单元格中有两个按钮 - 当创建单元格时,按钮操作作为addTarget添加到self(viewcontroller),然后进入操作。 viewcontroller按钮操作方法获取表格中按下的按钮行,然后更改单元格的文本和按钮的标题。

但当然,当我将该特定单元格滚出视图并返回视图时,它已被重置为开始状态。我认为这与细胞出列等有关。任何想法?

这是相关的位和代码:

自定义单元格:具有按钮和文本标签的插座。

单元格在数据源cellForRowAtIndexPath中创建代码...     {

static NSString *dialogueCellIdentifier = @"dialogueCellIdentifier";

dialogue_cell *cell = (dialogue_cell *)[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier];

if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"dialogue_cell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
    [[cell lButton] addTarget:self action:@selector(lButtonPressed:) forControlEvents:UIControlEventTouchUpInside];     
}

[[cell lButton] setTag:[indexPath row]];

NSString *row = [NSString stringWithFormat:@"%i",[indexPath row]];  
NSString *en = [[self.dataArray objectForKey:row] valueForKey:@"en"];

cell.mainText.text = en;


return cell;
}

和lButton方法......

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath];
NSString *row = [NSString stringWithFormat:@"%i",[sender tag]];
if ([thisCell.languageButton.currentTitle isEqualToString:@"en"]) {
    [thisCell.languageButton setTitle:@"zc" forState:UIControlStateNormal];
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_zc"];
} else {
    [thisCell.languageButton setTitle:@"en" forState:UIControlStateNormal];
    thisCell.mainText.text = [[self.lineArray objectForKey:row] valueForKey:@"lineText_en"];        
}

所以有两个问题:
1.有没有办法让单元格保留标签和按钮名称中的内容,即使它在屏幕外滚动?
2.有没有办法在单元格自定义类中设置标签和按钮名称,而不是将按钮操作发送到表所在的viewcontroller?

谢谢!

2 个答案:

答案 0 :(得分:1)

它与单元格的出列没有任何关系,而是与您在cellForRowAtIndexPath中显示的数据有关。每次要显示一个单元格时,都会调用此方法。

我假设您在按钮单击时更改单元格文本的语言。但每次重绘单元格时,您都会重新显示英文文本。 “保留”单元状态的一种方法是为每个单元格上使用的语言创建一个数组,并根据特定行的数组值,填充单元格的文本。您只需要维护数组中单元格的状态。

答案 1 :(得分:0)

好吧我也遇到了这个问题,带我走了很多但是我明白了,细胞排队是他们的钥匙在这里,当你试图让你的细胞回来时你正在使用这个

NSIndexPath *thisCellPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0];
dialogue_cell *thisCell = (dialogue_cell *)[self.dialogueTable cellForRowAtIndexPath:thisCellPath];

当单元格不在视图中时,表格视图会卸载此单元格,而当您调用此单元格时,您将获得一个处于原始状态(或者多为零)的单元格,因为它不再是表格视图的一部分,直到单元格为止回到视图屏幕。

你需要做的就是因为你重新排列了你的细胞,我会假设你正确地做了这个并且你给每个细胞命名不同,而不是做你上面所做的事情你必须得到你的细胞像这样

cell=[tableView dequeueReusableCellWithIdentifier:dialogueCellIdentifier];

这将为您的单元格提供用户修改时所处的状态...希望这有帮助! 至于你的第二个问题,你可以将目标设置为单元格而不是视图控制器,这将在自定义单元格类中调用该操作。