UITableView单元格/数据消失

时间:2011-04-13 11:09:49

标签: iphone objective-c ios ipad uitableview

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

tableview不完全适合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;
}

5 个答案:

答案 0 :(得分:3)

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

当用户更改textField中的值时,您要做的是更新数据源(在您的情况下为idenInfoRezprodInfoRezvizInfoRez)。因此,您必须将UIViewController设置为每个文本字段的委托,并在用户键入时更新值。

答案 1 :(得分:1)

[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;

}

注意:UIView动画不允许文本字段移走数据,或者任何UI控制器在旧状态下保持不变!! 不要提交动画,否则它将无法正常工作!!

答案 2 :(得分:0)

您可以做的是:在每个TextField存储的编辑更改事件中,值包含在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]

}

然后,您可以在重新创建单元格的任何时候使用TextField中的值填充NSMutableArray,即

(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.

}

另请注意,建议将yourMutable数组初始化为单元格数的容量。

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

答案 3 :(得分:0)

每次我们将单元格分配给不同的数据时,每次数据覆盖以前的数据时,数据都不会重新加载单元格,在分配单元格以清除单元格之前, 比如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];

        }

答案 4 :(得分:-1)

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

删除它:

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];

如果您的tableview中只有少量单元格(大约少于50个),那应该没问题。


更好的解决方案是让细胞重复使用,并按照要求填充文本字段。该方法因app而异,但您基本上不应该直接访问单元格,并将单元格的数据存储在其他位置,例如NSStrings的NSArray。然后你可以操纵NSArray。你的cellForRowAtIndexPath方法看起来像这样:

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