Контроллер текущего представления Снаружи контроллера без прохождения собственной ссылки - PullRequest
0 голосов
/ 31 августа 2018

У меня есть приложение, в котором есть администраторы и обычный пользователь, где администратор может удалять пользователей. После удаления пользователя мне нужно показать, что вы были удалены. Я получаю apn с сервера, на котором я должен показать ему контроллер представления, объясняющий, почему это происходит, а также очистить все его данные. В настоящее время, как только я получаю apn, я отправляю уведомление, полученное контроллером представления, из которого представлен этот контроллер представления.

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
self.present(viewController, animated: true) {
            print("Presented")
        }

Теперь размер проекта растет, поэтому теперь я передаю ссылку на себя функции, которая в основном делает то же самое

userInactivated(viewController: self) 

В контроллере всех видов в функции присутствует Контроллер представлений, заблокированных аккаунтом

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

if let presentingViewController = self.appDelegate.window?.rootViewController?.presentingViewController {}

Но в классе контроллеров без представления нет self.appDelegate

Любая помощь приветствуется, спасибо

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы можете использовать это расширение

extension UIApplication
{
    class func topViewController(_ base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController?
    {
        if let nav = base as? UINavigationController
        {
            let top = topViewController(nav.visibleViewController)
            return top
        }

        if let tab = base as? UITabBarController
        {
            if let selected = tab.selectedViewController
            {
                let top = topViewController(selected)
                return top
            }
        }

        if let presented = base?.presentedViewController
        {
            let top = topViewController(presented)
            return top
        }
        return base
    }

}

тогда вы можете использовать этот код для представления вашего контроллера из любого места

let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateViewController(withIdentifier: "AccountLockedController") as! AccountLockedController
UIApplication. topViewController()?.present(viewController, animated: true) {
            print("Presented")
        }
0 голосов
/ 31 августа 2018

Сначала необходимо выйти из системы и установить window?.rootViewController на Accountlocked View Controller

Вы можете получить доступ к делегату приложения, используя let appDelegate = UIApplication.shared.delegate as? AppDelegate

Если вы не хотите устанавливать значение rootViewController с Accountlocked View Controller, выйдите из системы и установите rootViewController на экран приложения пользователя, который не вошел в систему, и отобразите Accountlocked View Controller.

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