Отклоните клавиатуру касающейся историей UITableView

У меня есть a UITableView с UITextFields как ячейки. Я хотел бы отклонить клавиатуру когда фон UITableView затронут. Я пытаюсь сделать это путем создания a UIButton размер UITableView и размещение его позади UITableView. Единственная проблема UIButton ловит все касания, даже когда касание находится на UITableView. Что я делаю неправильно?

Спасибо!

101
задан shim 18 May 2017 в 15:18
поделиться

5 ответов

Я сделал это так:

Создайте метод в вашем TableViewController для деактивации первого респондента (который на тот момент будет вашим TextBox)

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}

В tableView: didSelectRowAtIndexPath: вызовите предыдущий метод:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}
7
ответ дан 24 November 2019 в 04:34
поделиться

Почему вы хотите создать таблицу с текстовыми полями? Вы должны использовать подробное представление для каждой строки, содержащей текстовые поля. Когда вы нажимаете подробное представление, убедитесь, что вы вызываете «[myTextField статьFirstResponder]», чтобы пользователь мог начать редактирование одним щелчком мыши от список таблиц.

0
ответ дан 24 November 2019 в 04:34
поделиться

Если вы готовы подклассифицировать (ух!) ваше представление таблицы, может сработать что-то вроде этого:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

   BOOL backgroundTouched = YES;

   for (UITouch *touch in touches) {
      CGPoint location = [touch locationInView:self];
      for (UITableViewCell *cell in self.visibleCells) {
         if (CGRectContainsPoint(cell.frame, location)) {
            backgroundTouched = NO;
            break;
         }
      }
   }

   if (backgroundTouched) {
      for (UITableViewCell *cell in self.visibleCells) {
         // This presumes the first subview is the text field you want to resign.
         [[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
      }
   }

   [super touchesBegan:touches withEvent:event];
}
0
ответ дан 24 November 2019 в 04:34
поделиться
@interface DismissableUITableView : UITableView {
}
@end

@implementation DismissableUITableView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 [self.superview endEditing:YES];
 [super touchesBegan:touches withEvent:event];
}

@end

Затем убедитесь, что в вашем файле Nib вы установили тип вашего UITableView на DismissableUITableView ..... возможно, я мог бы придумать лучшее имя для этого класса, но вы поняли суть .

4
ответ дан 24 November 2019 в 04:34
поделиться

UITableView является подклассом UIScrollView.

Я сделал это таким образом, чтобы прослушивать событие прокрутки пользователем, а затем resignFirstResponder. Вот метод UIScrollViewDelegate для реализации в вашем коде;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

При подходе к такого рода проблемам я обнаружил, что лучший способ — исследовать протоколы делегирования для каждого объекта и протоколы родительских классов (в данном случае UITableViewDelegate, UIScrollViewDelegate. Количество событий, запускаемых NS-объектами, довольно велико и Также проще реализовать протокол, чем создать подкласс чего-либо

.
2
ответ дан 24 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: