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中改变了一个值时,你要做的就是更新你的数据源(在你的情况下是idenInfoRez
, prodInfoRez
和vizInfoRez
)。 所以你必须将你的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];