UITableView单元格/数据消失

我有一个分段的tableView加载所有部分的所有单元格中的所有数据。 每个单元格中都有一个textField。

桌面视图不能完全适应iPad屏幕,我不能访问所有不可见的单元格以读取/保存数据。 当我在“textField”中进行更改,然后向上滚动,向下滚动,所有更改都消失了。

我需要加载所有单元格,甚至不可见一次,以便能够访问它们。

我很抱歉,我刚刚在几天前开始使用表格……我认为这个问题与可重用单元格有关,但不知道如何解决这个问题。

请寻求你的帮助。

初始化:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ; textField.enabled = NO; cell.accessoryView = textField; [textField release]; } UITextField *textField = (UITextField*)cell.accessoryView; if(indexPath.section == 0) cell.textLabel.text = [idenInfo objectAtIndex:indexPath.row]; else if (indexPath.section == 1) cell.textLabel.text = [prodInfo objectAtIndex:indexPath.row]; else if (indexPath.section == 2) cell.textLabel.text = [visInfo objectAtIndex:indexPath.row]; if(indexPath.section == 0) textField.text = [idenInfoRez objectAtIndex:indexPath.row]; else if (indexPath.section == 1) textField.text = [prodInfoRez objectAtIndex:indexPath.row]; else if (indexPath.section == 2) textField.text = [visInfoRez objectAtIndex:indexPath.row]; textField = nil; return cell; } 

首先:你不需要加载所有的单元格,包括不可见单元格。 这是UITableView和MVC模式的重点:将您的视图与数据分开。

当用户在textField中改变了一个值时,你要做的就是更新你的数据源(在你的情况下是idenInfoRezprodInfoRezvizInfoRez )。 所以你必须将你的UIViewController设置为每个文本字段的委托,并在用户input时更新这些值。

[UIView beginAnimations:@“ShiftUp”context:nil]; [UIView setAnimationDuration:0.0001]; – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {NSInteger section = [indexPath section];

 static NSString *CellIdentifier = @"Cell"; CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if(cell == nil){

  [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; cell = objCustCell; cell.selectionStyle = UITableViewCellSelectionStyleNone ; 

}

 if (section == 0) { switch (indexPath.row) { case 0:{ cell.lable.text = @"Date of Birth"; cell.field.placeholder = @"Birth Name"; break; } case 1:{ cell.lable.text = @"Enter Your Name"; cell.field.placeholder = @"Full Name"; break; } default: break; } } [UIView beginAnimations:@"ShiftUp" context:nil]; [UIView setAnimationDuration:0.0001]; // [UIView beginAnimations: @"ShiftUp" context:nil]; NSLog(@"Load cellfor raw at index "); // Configure the cell. return cell; 

}

注意:UIViewanimation将不允许文本字段移走数据或任何UIcontroller将保持原来的状态相同! 不要提交animation,否则将无法正常工作!

你可以做的是这样的:在每个TextField存储的Editing Changed事件中,值都包含在NSMutableArray中的文本字段中,其数目等于单元格的数量。 即

 -(IBAction) EditingChanged: (id) sender { UITextField *txt =(UITextField*)sender; NSString* str =[[NSString alloc] initWithString: txt.text]; //get current text string NSInteger path =[tableView indexPathForSelectedRow].row; // get currently selected row, this could be a bit different depending on the number of sections [yourMutableArray insertObject: str atIndex: path]; [str release] } 

然后你可以用NSMutableArray的值填充TextField ,只要单元格被重新创build即可

 (UITableViewCell *) tableView: (UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath { ...... // create the cells here and use viewTag to get the textFields textField.text= [yourMutableArray objectAtIndex:indexPath.row]; //This may be a bit different depending on the number of sections. } 

此外,请注意,可能build议您将您的yourMutable数组初始化为单元数量的容量。

我很抱歉,如果代码格式不正确,因为这是我在stackoverflow上的第一篇文章 – 也可能在代码中有一些错别字。 希望这有助于某人。

每次我们将单元分配给不同的数据时,数据将不会重新加载单元,每次数据覆盖之前的数据,在将单元分配给单元之前,就像cell = nil

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; cell=nil; //it clear data in the cell if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ; textField.enabled = NO; cell.accessoryView = textField; [textField release]; } 

你是对的,问题是细胞将被重复使用。 有两个解决scheme的问题,快速和肮脏的将不使用可重用的单元格:

删除这个:

 static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { 

而只是离开这个:

  UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 400, 30)] ; textField.enabled = NO; cell.accessoryView = textField; [textField release]; 

这应该是好的,如果你只有less数的单元格在你的tableview(大约less于50)。


更好的解决scheme是将细胞重新使用,并根据要求填写文本字段。 不同的应用程序的方法不同,但基本上不应该直接访问单元格,并将单元格的数据存储在其他地方,例如NSStrings的NSArray。 你可以操纵NSArray。 你的cellForRowAtIndexPath方法看起来像这样:

 textField.text = [arrData objectAtIndex:indexPath.row];