我目前正试图让这个工作。任何帮助表示赞赏。
我有一个内置UITableViewCell
的自定义UITextField
。当我选择表格单元格时,我想让UITextField
第一个响应者
但是[textField becomeFirstResponder];
会返回 false 。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
UITextField *textField;
for (UIView *view in [cell subviews]) {
if ([view isMemberOfClass:[UITextField class]]) {
textField = ((UITextField *)view);
}
}
[textField becomeFirstResponder];
}
根据要求,文本字段的初始化。这是在UITableViewCell
子类中完成的:
- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Init Textfield
_textField = [[UITextField alloc] init];
_textField.backgroundColor = [UIColor clearColor];
_textField.delegate = self;
[self addSubview:_textField];
}
return self;
}
答案 0 :(得分:14)
如果您有自定义单元格,那么您可以执行以下操作:
@implementation CustomCell
#pragma mark - UIResponder
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (BOOL)becomeFirstResponder
{
return [self.textField becomeFirstResponder];
}
@end
然后在表视图中委托:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if ([cell canBecomeFirstResponder]) {
[cell becomeFirstResponder];
}
}
答案 1 :(得分:3)
为每个tag
提供UITextField
,并使用以下代码:
UITableViewCell* cell = (UITableViewCell*)sender.superview.superview;
UITextField *txtField = (UITextField*)[cell viewWithTag:tag];
[txtField becomeFirstResponder];
在didSelectRowAtIndexPath
方法中。
它的工作非常好.. :)
答案 2 :(得分:2)
我相信你需要设置textField
的{{1}}财产。
在致电delegate
textField.delegate = self;
添加到您的方法中
答案 3 :(得分:2)
我认为您在创建单元格时应在文本字段中包含标记值:
- (id) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Init Textfield
_textField = [[UITextField alloc] init];
_textField.backgroundColor = [UIColor clearColor];
_textField.delegate = self;
_textField.tag = 999;
[self addSubview:_textField];
}
return self;
}
在didSelectRowAtIndexPath方法上使用标记值来恢复对象:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
UITextField *textField = (UITextField*)[cell viewWithTag:999];
if (![textField isFirstResponder]){
[textField becomeFirstResponder];
}
}
我已经包含了一个验证来控制文本字段是否已经是第一个响应者。
希望它按预期工作
答案 4 :(得分:0)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
UITextField *textField;
for (id subV in [cell subviews]) {
if ([subV isKindOfClass:[UITextField class]]) {
textField = (UITextField *)subV;
[textField becomeFirstResponder];
break;
}
}
}
我认为这会对你有所帮助。
答案 5 :(得分:0)
更新了@ josh-fuggle的答案以使用Swift 2.2。
import Foundation
import UIKit
class CustomTableCell:UITableViewCell {
@IBOutlet var textValue: UITextField!
override func canBecomeFirstResponder() -> Bool {
return true
}
override func becomeFirstResponder() -> Bool {
return self.textValue.becomeFirstResponder()
}
}
这是在你的表视图委托:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let cell = tableView.cellForRowAtIndexPath(indexPath)
if ((cell?.canBecomeFirstResponder()) != nil) {
cell?.becomeFirstResponder()
}
}
答案 6 :(得分:0)
您可以执行以下操作:
class CustomCell: UITableViewCell {
@IBOutlet weak var textField: UITextField!
override func awakeFromNib() {
super.awakeFromNib()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(contentViewTapped))
self.contentView.addGestureRecognizer(tapGesture)
}
@objc func contentViewTapped() {
_ = self.textField.becomeFirstResponder()
}
}
答案 7 :(得分:-2)
[self.titleLab performSelector:@selector(becomeFirstResponder)withObject:nil afterDelay:0.2];