Как оставить текстовое поле в качестве первого респондента в uitableviewcell - PullRequest
6 голосов
/ 24 ноября 2011

Я использую этот код, чтобы оставить свой UITextField как firstResponder при использовании стандартного UIView.

Но у меня теперь UITextField в моем UITableViewCell в UITableView, и код не передает текстовое поле в качестве первого респондента, когда я щелкаю за пределами textField. Есть идеи, как сделать эту работу?

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

    UITouch *touch = [[event allTouches] anyObject];
    if ([self.temperatureTextField isFirstResponder] && [touch view] != self.temperatureTextField) {
        [self.temperatureTextField resignFirstResponder];
    }
    [super touchesBegan:touches withEvent:event];
}

enter image description here

Ответы [ 2 ]

14 голосов
/ 24 ноября 2011

[[self tableView] endEditing:YES]; - это мой стандартный подход.

1 голос
/ 23 мая 2014

Чтобы дополнить ответ Мэтта Уилдинга для конкретного случая UITableView, я использую следующий подход: Обычно мы хотим скрыть клавиатуру в двух сценариях: при нажатии вне элементов текстового интерфейса пользователя или при прокрутке UITableView вверх / вниз. Первый сценарий мы можем легко добавить с помощью TapGestureRecognizer, а второй - с помощью UIScrollViewDelegate scrollViewWillBeginDragging: метод. Первый порядок бизнеса, способ скрыть клавиатуру:

   /**
     *  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];

    }

Этот метод отказывается от любого пользовательского интерфейса textField для подпредставлений в иерархии представлений UITableView, поэтому он более практичен, чем самостоятельная отставка каждого отдельного элемента.

Далее мы позаботимся об исключении с помощью внешнего касания с помощью:

- (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];

}

Установка для tapGestureRecognizer.cancelsTouchesInView значения NO означает, что не позволяет gestRecognizer переопределять обычные внутренние операции UITableView (например, чтобы не мешать выбору ячейки).

Наконец, чтобы справиться с сокрытием клавиатуры при прокрутке вверх / вниз UITableView, мы должны реализовать протокол scrollViewWillBeginDragging: метод UIScrollViewDelegate, как:

.h файл

@interface MyViewController : UIViewController <UIScrollViewDelegate>

.m файл

#pragma mark - UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self hideKeyboard];
}

Надеюсь, это поможет! =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...