2

我有一个带有关联 UITableViewController 的 UITableView。但是,我已经修改了表格,使其也有一个带有文本字段子视图的视图。

与往常一样,我希望当用户点击“完成”(简单)以及触摸屏幕上除文本字段以外的任何其他位置(硬,卡住!)时键盘消失。

实现这一点的正常方法是将类更改为 UIControl 以便它可以处理操作......但我不能为我的 UITableView/UITableViewController 组合执行此操作。

我怎么解决这个问题?

4

4 回答 4

6

UITapGestureRecognizer你可以通过在视图中添加一个来处理用户触摸。
例如,如果你不想在你的 tableView 中启用行选择,你调用self.tableView.allowsSelection = NO;
但是如果你仍然想检测用户触摸你添加一个UITapGestureRecognizer到你的 tableView(或 tableView.superview)。
如果您实施 ,您可以拥有更多控制权UIGestureRecognizerDelegate,这样您可以检测然后选择女巫触摸接收和女巫不接收。
为此,只需将此代码添加到您的UITableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableView.allowsSelection = NO;

    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)];
    tgr.delegate = self;
    [self.tableView addGestureRecognizer:tgr]; // or [self.view addGestureRecognizer:tgr];
    [tgr release];
}    

- (void)viewTapped:(UITapGestureRecognizer *)tgr
{
    NSLog(@"view tapped");  
    // remove keyboard
}

// 这是可选的,它让你选择要接收的女巫触摸,例如这里我正在检查用户是否点击了文本字段

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ([touch.view isKindOfClass:[UITextField class]]) {
        NSLog(@"User tapped on UITextField");
    }
    return YES; // do whatever u want here
}
于 2012-08-04T22:07:24.487 回答
4

通常的做法是在键盘视图后面放置一个自定义 UIButton(它仅在 uitextfield 开始编辑时才可见),当用户点击屏幕时,他实际上点击了该按钮,并且相关的选择器可以退出第一响应者。

-(void) closeKeyboard:(UIButton *) b {
    [self.view endEditing:YES]; //assuming self is your top view controller.
    [b setHidden:YES];  
}

使用 endEditing 更好,因为它会遍历所有子视图并查找当前的第一响应者。

于 2012-08-04T15:43:41.707 回答
2

在启用 ARC 的情况下使用分配中断

只需将以下内容添加到 viewController

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    //where text field is a @property (nonatomic,retain) IBOutlet to your textfield
    [textField resignFirstResponder]; 
}
于 2013-06-08T17:21:55.743 回答
0

当一行被点击时,didSelectRowAtIndexPath被调用。如果点击位于行内的文本字段,则调用文本字段委托。

因此,除了您的完成按钮方法之外,还要didSelectRowAtIndexPath检查文本字段是否为第一响应者并要求其辞职。假设选定的 indexPath 不是文本字段的行。

于 2012-08-04T16:17:33.943 回答