Невозможно программно сбросить UINavigationController.presentedViewController - PullRequest
0 голосов
/ 29 июня 2018

Я написал этот пример игровой площадки Xcode, чтобы продемонстрировать, что у меня проблема:

import PlaygroundSupport
import UIKit

let rootViewController = UIViewController()
rootViewController.view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 640.0, height: 640.0))
let navigationController = UINavigationController(rootViewController: rootViewController)
PlaygroundPage.current.liveView = navigationController

var alertController: UIAlertController! = UIAlertController(title: "Test", message: "This is a test", preferredStyle: .alert)
rootViewController.present(alertController, animated: true, completion: nil)

alertController.dismiss(animated: false, completion: nil)
rootViewController.presentedViewController

alertController = UIAlertController(title: "Another Test", message: "This is another test", preferredStyle: .alert)
rootViewController.present(alertController, animated: true, completion: nil)

rootViewController.presentedViewController!.title

Я ожидаю, что заголовок для представленного ViewController будет «Другой тест» . На самом деле это название «Test» , означающее, что контроллер навигации все еще поддерживает первоначальный представленный контроллер представления, даже если он был отклонен.

Каким будет правильный способ программного сброса представленного ViewController для UINavigationController?

1 Ответ

0 голосов
/ 29 июня 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что анимации требуют времени, и вы вызываете второй подарок, прежде чем первый завершит презентацию и увольнение. Даже при одушевленном false эти звонки занимают некоторое время Если вы используете замыкания завершения и соединяете их вместе, появляется второе предупреждение с правильным заголовком:

let rootViewController = UIViewController()
rootViewController.view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 640.0, height: 640.0))
let navigationController = UINavigationController(rootViewController: rootViewController)
PlaygroundPage.current.liveView = navigationController

var alertController: UIAlertController! = UIAlertController(title: "Test", message: "This is a test", preferredStyle: .alert)

rootViewController.present(alertController, animated: true) {
    alertController.dismiss(animated: false) {
        alertController = UIAlertController(title: "Another Test", message: "This is another test", preferredStyle: .alert)
        rootViewController.present(alertController, animated: true, completion: nil)
    }
}

Если вы запустите исходный код из Xcode, вы увидите следующее сообщение в консоли:

Warning: Attempt to present <UIAlertController: 0x7fab67825200> on <TestProject.ViewController: 0x7fab66d0e090> while a presentation is in progress!

Это говорит о том, что первый контроллер предупреждений все еще присутствует, когда сделан вызов для представления второго.

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