UITableViewCell与UITextField失去了selectUITableView行的能力?

我几乎完成与UITextField实现UITableViewCell中。 而不是然后通过CGRectMakeUITableViewCell.contentView我已经实现它更简单的方法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [[cell textLabel] setText:@"Amount"]; [cell addSubview:amountField]; return cell; } 

然后,我还实现了didSelectRow方法,resigning textField允许显示其他字段input视图。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... [amountField resignFirstResponder]; ... } 

这工作顺利,只有东西是在表中的其他行,当其他行被选中时,整个单元格被选中,变成蓝色,而与我的UITextField没有,我的意思是字段被选中,我可以input文字但单元格未选中。 我testing了一下,发现问题在于:

 [cell addSubview:amountField]; 

看来这打破了可select的单元格行为,甚至将它添加到[cell contentView]不能解决这个问题。 我错过了什么?

如果文本字段的userInteractionEnabled设置为YES ,并填充整个单元格,则无法使单元格听取触摸。 为了让单元格响应触摸,您需要将文本字段的userInteractionEnabled设置为NO

编辑:如果要使文本字段可编辑,选中单元格时,请在didSelectRowAtIndexPath:方法中添加以下代码,

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // get the reference to the text field [textField setUserInteractionEnabled:YES]; [textField becomeFirstResponder]; } 

你没有通过添加子视图来破坏任何东西,而是UITextField正在捕获UITableViewCell之前的触摸。 你可以通过点击UITextField的外部来testing,但是在UITableViewCell的范围内,你会发现它实际上仍然按照你所期望的那样进行select。

为了解决这个问题,你可以inheritanceUITextField并添加一个UITableView属性。 在实例化UITextField并将其添加到单元格时设置属性。

 amountField.tableView = tableView; 

然后你需要在你的子类中重写becomeFirstResponder ,并且在方法中获取带有UITextField的单元格的行,然后手动select它

 - (BOOL)becomeFirstResponder { // Get the rect of the UITextView in the UITableView's coordinate system CGRect position = [self convertRect:self.frame toView:self.tableView]; // Ask the UITableView for all the rows in that rect, in this case it should be 1 NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:position]; // Then manually select it [self.tableView selectRowAtIndexPath:[indexPaths objectAtIndex:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; return YES; } 

第一件事是你还没有使用可重复使用的单元格。 您提供的编码将导致大量的内存。

接下来的事情是你可以通过触摸文本框以外的区域来select行。

你的问题的一个解决scheme是

在你的textField委托

 UITableViewCell *cell = (UITableViewCell *)[textField superView]; cell.selected=YES; //I think this will call the didSelectRowATIndex; 

我不确定这会起作用。 但值得一试。

首先你需要为cellForRowAtIndexPath使用reuseIdentifier,如果你不使用reuseIdentifier的原因是:当你上下滚动时,它总是会分配新的cell和新的textfields,所以你需要把cell == nil条件,所以修改后的代码在这儿:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *reuseIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; if (cell==nil) { cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease]; UITextField *amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [cell.contentView addSubview:amountField]; } [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [[cell textLabel] setText:@"Amount"]; return cell; } 

在didSelect委托方法,你可以这样做

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [prevField resignFirstResponder]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; UIView *view = [[cell.contentView subviews] lastObject]; if([view isKindOfClass:[UITextField class]]{ currentField = (UITextField*)view; } [currentField becomeFirstResponder]; prevField = currentField; } 

在索引path的行的单元格内添加以粗体给出的这一行,

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [[cell textLabel] setText:@"Amount"]; **for (UIView *cellSubViews in cell.subviews) { cellSubViews.userInteractionEnabled = NO; }** [cell addSubview:amountField]; return cell; } 

试试这个,它会起作用