我有一个分段的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;
}
答案 0 :(得分:3)
首先:您不必加载包括不可见单元格在内的所有单元格。这就是UITableView和MVC模式的重点:将您的视图与数据分开。
当用户更改textField中的值时,您要做的是更新数据源(在您的情况下为idenInfoRez
,prodInfoRez
和vizInfoRez
)。因此,您必须将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];