微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UITableView单元格/数据消失

如何解决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,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内部的值时,您要做的就是更新数据源(在您的情况下为
idenInfoRez
prodInfoRez
vizInfoRez
)。因此,您必须将UIViewController设置为每个文本字段的委托,并在用户键入时更新值。     ,[UIView beginAnimations:@ \“ ShiftUp \”上下文:无];     [UIView setAnimationDuration:0.0001];     -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {     NSInteger部分= [indexPath部分];
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动画将不允许文本字段移走数据,否则任何UIcontroller都将保持原来的状态! 不要提交动画,否则它将无法正常运行!     ,您可以执行以下操作:在每个ѭ7the的Edited 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
(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.

}
另外,请注意,建议将“ 13”数组初始化为单元格数量的容量。 很抱歉,如果代码格式不正确,因为这是我在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,400,30)] ;
                textField.enabled = NO;
                cell.accessoryView = textField;
                [textField release];

        }
    ,没错,问题在于单元将被重用。有两种解决方案,一种快速而肮脏的解决方案是不使用可重复使用的单元: 删除此:
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,30)] ;
    textField.enabled = NO;
    cell.accessoryView = textField;
    [textField release];
如果表视图中单元格的数量很少(大约少于50个),那应该没问题。 更好的解决方案是保留单元重用,并根据需要填充其文本字段。该方法因应用程序而异,但是基本上您绝对不应该直接访问单元格,并且将单元格​​的数据存储在其他位置,例如NSStrings的NSArray。然后,您可以操纵NSArray。您的cellForRowAtIndexPath方法将如下所示:
textField.text = [arrData objectAtIndex:indexPath.row];
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。