Получение ошибки моментального снимка при выходе из приложения после отображения клавиатуры (требуется afterScreenUpdates: YES) - PullRequest
0 голосов
/ 05 июля 2019

В настоящее время я запускаю новый тестовый проект для импорта сертификата клиента через отдельное (модальное) представление.Приложение всегда начинается с просмотра «Основной вид» ( Главный вид ), где у меня есть несколько фиктивных элементов для проверки работоспособности соединения.Как только пользователь добавляет файл в мое приложение (например, открывает его по почте или перетаскивает в симуляторе), представление «Импорт сертификата» отображается через Segue.Когда пользователь нажимает на текстовое поле «Введите пароль сертификата», появляется клавиатура.При возврате вызывается .resignFirstResponder () и приложение через метку, если введенный пароль правильный для импортированного сертификата клиента p12.Я хочу, чтобы представление «Импорт сертификата» ( Просмотр импорта сертификата ) было закрыто, когда приложение закрыто или активирована многозадачность.Я понял это, вызвав метод dismiss (animated: завершением :) в методе applicationWillResignActive (application :) делегата приложения в CertificateImportViewController.

Теперь моя проблема возникает, когда я закрываю свое приложение или переключаюсь на многозадачность ТОЛЬКО после клавиатурыбыл показан в «представлении импорта сертификатов».

Когда я закрываю / многозадачность приложения в следующих состояниях, я получаю соответствующую запись в консоли отладчика:

  1. Когда клавиатура / была показана / я нахожусь вПросмотр импорта сертификатов: [Snapshotting] Snapshotting a view (0x7fa91506b200, UIKeyboardImpl) that is not in a visible window requires afterScreenUpdates:YES.

  2. Даже когда я вышел из просмотра импорта сертификатов и вернулся в «Основное представление»: [Snapshotting] Snapshotting a view (0x7fa91506b200, UIKeyboardImpl) that is not in a visible window requires afterScreenUpdates:YES.

  3. После того, как мне показали клавиатуру в представлении импорта сертификатов, оставили приложение, снова откройте приложение и затем закройте / многозадачность приложения: [Snapshotting] Snapshotting a view (0x7f99e3821600, UIKeyboardImpl) that has not been rendered at least once requires afterScreenUpdates:YES.

Я попытался выяснить, что делаетОС считает, что нужно сделать снимок, включая клавиатуру, хотя на главном экране клавиатура не отображается.Я также попытался выяснить, почему клавиатура считает, что она должна сделать снимок клавиатуры после того, как она была отклонена (resignFirstResponder ()).Я не уверен, как отлаживать то, что хранит мое представление импорта сертификатов в стеке (что, я считаю, могло бы послужить причиной).

AppDelegate.swift

func applicationWillResignActive(_ application: UIApplication) {

    guard let rv = window?.rootViewController as? UINavigationController else {
        print("No Navigation Controller")
        return
    }

    if let r = rv.presentedViewController as? UINavigationController, let c = r.topViewController as? CertificateImportViewController {
        c.dismiss(animated: true, completion: nil)
    }
}


func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

    self.fileBlobURL = url

    guard let rv = window?.rootViewController as? UINavigationController else {
        print("No Navigation Controller")
        return false
    }

    guard let myEntryViewController = rv.topViewController, myEntryViewController.title == "MainView" else {
        print("Wrong View Controller")
        return false
    }

    myEntryViewController.performSegue(withIdentifier: "ShowCertificateImport", sender: myEntryViewController)

    return true
}

CertificateImportViewController.swift

class CertificateImportViewController: UIViewController {

    var fileURL: URL?
    var credential: URLCredential?

    @IBOutlet weak var certpwTextField: UITextField!
    @IBOutlet weak var certResult: UILabel!
    @IBOutlet weak var saveButton: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()

        certpwTextField.delegate = self

        let appdelegate = UIApplication.shared.delegate as! AppDelegate
        guard let u = appdelegate.fileBlobURL else {
            print("No file blob path found!")
            return
        }

        self.fileURL = u
    }

    @IBAction func cancel(_ sender: UIBarButtonItem) {
        dismiss(animated: true, completion: nil)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        certpwTextField.resignFirstResponder()
        certpwTextField.delegate = nil

    }
}

1 Ответ

0 голосов
/ 13 июля 2019

После еще нескольких исследований, включая множество проб и ошибок, я понял, что:

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

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