如何解决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 举报,一经查实,本站将立刻删除。