Wiele ciekawych odpowiedzi. Chciałbym skompilować różne podejścia do rozwiązania, które moim zdaniem najlepiej pasuje do scenariusza UITableView (jest to ten, którego zwykle używam): Zwykle chcemy ukryć klawiaturę w dwóch scenariuszach: po dotknięciu poza elementami interfejsu tekstowego, lub podczas przewijania w dół / w górę UITableView. Pierwszy scenariusz możemy łatwo dodać za pomocą TapGestureRecognizer, a drugi za pomocą metody UIScrollViewDelegate scrollViewWillBeginDragging:. Pierwsza sprawa, sposób na ukrycie klawiatury:
/**
* Shortcut for resigning all responders and pull-back the keyboard
*/
-(void)hideKeyboard
{
//this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
[self.tableView endEditing:YES];
}
Ta metoda rezygnuje z dowolnego interfejsu użytkownika textField z podglądów podrzędnych w hierarchii widoku UITableView, więc jest bardziej praktyczna niż rezygnacja z każdego pojedynczego elementu niezależnie.
Następnie zajmiemy się zwolnieniem za pomocą zewnętrznego gestu Tap, za pomocą:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setupKeyboardDismissGestures];
}
- (void)setupKeyboardDismissGestures
{
// Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
// UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
// swipeUpGestureRecognizer.cancelsTouchesInView = NO;
// swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
// [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//this prevents the gestureRecognizer to override other Taps, such as Cell Selection
tapGestureRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapGestureRecognizer];
}
Ustawienie opcji tapGestureRecognizer.cancelsTouchesInView na NO ma na celu uniknięcie zastąpienia przez gestRecognizer normalnych wewnętrznych działań UITableView (na przykład nie kolidować z zaznaczaniem komórki).
Wreszcie, aby obsłużyć ukrywanie klawiatury przy przewijaniu w górę / w dół UITableView, musimy zaimplementować protokół UIScrollViewDelegate scrollViewWillBeginDragging: method, jako:
plik .h
@interface MyViewController : UIViewController <UIScrollViewDelegate>
plik .m
#pragma mark - UIScrollViewDelegate
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self hideKeyboard];
}
Mam nadzieję, że to pomoże! =)