Почему мой ViewController представляется модально два раза подряд после одного вызова метода (_: animated: завершением :)? - PullRequest
0 голосов
/ 19 января 2019

Когда я пытаюсь модально представить контроллер представления на 4-й вкладке моего TabBarController, который является TableViewController, встроенным в NavigationViewController, он представляется два раза подряд. Фактический метод present(_:animated:completion:) вызывается два раза подряд, когда это должно происходить только один раз.

Вот как я вызываю метод из UITableViewController. Теперь, поскольку я получал предупреждение «Попытка представить vc, вид которого не находится в иерархии окон», я попытался обойти это, и я больше не получаю это предупреждение, но теперь у меня есть эта проблема.

((UIApplication.shared.keyWindow?.rootViewController as? MainTabBarViewController)?.selectedViewController as? NavigationPodesavanjaViewController)?.visibleViewController?.present(Egg, animated: true, completion: nil)

Это все содержимое контроллера представления, которое будет представлено. На данный момент это просто фиктивный контент с кнопкой возврата:

import UIKit

class EasterEggViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    view.backgroundColor = ConstantsClass.ljubicastaBoja

    let imageView = UIImageView(image: UIImage(named: "operator-ikonica"))
    view.addSubview(imageView)

    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    imageView.frame.size = CGSize(width: 250, height: 250)

    let backButton = UIButton()
    view.addSubview(backButton)

    backButton.setTitle("Nazad", for: .normal)
    backButton.titleLabel?.textColor = .white
    backButton.frame = CGRect(x: 50, y: 50, width: 100, height: 20)
    backButton.titleLabel?.adjustsFontSizeToFitWidth = true
    backButton.addTarget(self, action: #selector(dismissAction), for: .touchUpInside)

}

@objc func dismissAction() {
    dismiss(animated: true, completion: nil)
}


}

Представленный метод вызывается в обработчике для длительного нажатия клавиши. // ПРИМЕЧАНИЕ. Когда я изменил долгое нажатие на нажатие, он работал как надо, когда я снова его изменил, он снова был представлен два раза.

Это часть кода из viewDidLoad:

    let longPressEgg = UILongPressGestureRecognizer()
    longPressEgg.addTarget(self, action: #selector(easterEggScreenPresent))
    easterEgg.addGestureRecognizer(longPressEgg)

А это обработчик:

 @objc func easterEggScreenPresent(){

    let Egg = EasterEggViewController()
    ((UIApplication.shared.keyWindow?.rootViewController as? MainTabBarViewController)?.selectedViewController as? NavigationPodesavanjaViewController)?.visibleViewController?.present(Egg, animated: true, completion: nil)
}

1 Ответ

0 голосов
/ 19 января 2019

A UILongPressGestureRecognizer вызывается несколько раз с разными состояниями.В вашем случае вы должны представить контроллер вида, когда начинается жест.Измените easterEggScreenPresent на следующее:

@objc func easterEggScreenPresent(sender: UILongPressGestureRecognizer) {
    guard sender.state == .began else { return }

    let egg = EasterEggViewController()
    ((UIApplication.shared.keyWindow?.rootViewController as? MainTabBarViewController)?.selectedViewController as? NavigationPodesavanjaViewController)?.visibleViewController?.present(egg, animated: true, completion: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...