Попасть в корень при двойном нажатии на кнопку Назад UINavigationBar

Вы используете getpwuid для поиска записи файла пароля для определенного UID (который включает имя пользователя, но теперь не сам пароль) и getgrgid для поиска записи в файле группы для определенного GID.

1
задан Daniel Z. 18 January 2019 в 07:14
поделиться

3 ответа

Когда я увидел этот вопрос, я реализовал эту идею в своем текущем проекте, и она сработала, спасибо за это. Так что идея сделать это, есть пользовательская кнопка назад. Я мог бы опубликовать весь код к этому, но это сделало бы это кормлением с ложечки. В любом случае, здесь идут шаги:

Сделайте UIButton и сделайте его своей собственной кнопкой возврата UIBarButtonItem в панели навигации вашего контроллера навигации, если вы когда-либо используете ее.

Селектор был бы, очевидно, таким, не обращайте внимания на код внутри, потому что он взят из моего проекта, но вы поняли:

func back() {
        if let navCon = self.navigationController {
            navCon.popViewController(animated: true)
        }
  }

И для двойного нажатия, для этого вам понадобится TapGesture. У меня есть этот объявлен так:

private lazy var doubleTapGesture: UITapGestureRecognizer = {
    let gesture = UITapGestureRecognizer(target: self, action: #selector(self.doubleTap))
    gesture.numberOfTapsRequired = 2
    return gesture
}()

и добавить это к вашей кнопке. Селектор будет выглядеть так:

@objc private func doubleTap() {
        self.navigationController?.popToRootViewController(animated: true)
}

VOILA! Работает плавно. Легко, правда? Надеюсь, это поможет!

0
ответ дан Glenn 18 January 2019 в 07:14
поделиться

Спасибо за все ваши ответы, но моя проблема заключалась в том, что я не хочу такого поведения, мой пост был неверно истолкован, и я прошу прощения за это.

В противном случае, я решил сам проблему. В панель навигации контроллера навигации было добавлено подпредставление, которое было скрыто под панелью. И так или иначе, у этого subView было включено взаимодействие, даже если оно было ниже. Поэтому я отключил взаимодействие, когда скрыто. Вот и все.

0
ответ дан Daniel Z. 18 January 2019 в 07:14
поделиться

Как я прокомментировал выше при ответе Гленнса, отправка popViewController в основной поток может быть проблемой, потому что он будет выполняться также при распознавании двойного касания. Может быть, это немного более «стабильное» решение:

private func setupBackButton() {
    let myBackButton = UIButton(type: .custom) // or whatever
    // setup title, image etc.

    let myCustomBackButtonItem = UIBarButtonItem(customView: myBackButton)
    self.navigationItem.leftBarButtonItem  = myCustomBackButtonItem         

    // Create gesture recognizers for single and double tap:
    let singleRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.singleTap))
    singleRecognizer.numberOfTapsRequired = 1

    let doubleRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.doubleTap))
    doubleRecognizer.numberOfTapsRequired = 2

    // single tap should only fire if double tap is not recognized
    singleRecognizer.require(toFail: doubleRecognizer)

    myBackButton.addGestureRecognizer(singleRecognizer)
    myBackButton.addGestureRecognizer(doubleRecognizer)
}

@objc private func singleTap() {
    self.navigationController?.popViewController(animated: true)
}

@objc private func doubleTap() {
    self.navigationController?.popToRootViewController(animated: true)
}
0
ответ дан Andreas Oetjen 18 January 2019 в 07:14
поделиться
Другие вопросы по тегам:

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