UITableViewCell与UITextField失去了selectUITableView行的能力?
我几乎完成与UITextField
实现UITableViewCell
中。 而不是然后通过CGRectMake
和UITableViewCell.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; }
试试这个,它会起作用
- 我可以用addOperationWithBlock取消添加到NSOperationQueue的Block吗?
- 删除iOS 5 ARC中的NSNotificationCenter观察者
- * .h和* .m文件中的两个接口
- 我可以知道用户何时删除我的应用程序吗?
- 标签栏控制器不是所有的UIViewControllers
- 删除应用程序并重新安装之后,徽章计数会持续存在
- 如何在iOS上调用Rootview控制器
- 从UICollectionView的viewForSupplementaryElementOfKind获取NSFetchedResultsController节对象
- 我在哪里可以得到UISearchBar中使用的放大镜图标?