Подтвердить что ты не робот

Как вы проверяете текущий класс контроллера вида в Swift?

Насколько я знаю, это будет работать в Objective-C:

self.window.rootViewController.class == myViewController

Как проверить, является ли текущий контроллер представления конкретным?

4b9b3361

Ответ 2

Обновлен для компилятора Swift3, бросающего подгонку! а также?

if let wd = UIApplication.shared.delegate?.window {
        var vc = wd!.rootViewController
        if(vc is UINavigationController){
            vc = (vc as! UINavigationController).visibleViewController

        }

        if(vc is LogInViewController){
            //your code
        }
    }

Ответ 3

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

if let viewControllers = navigationController?.viewControllers {
    for viewController in viewControllers {
        // some process
        if viewController.isKindOfClass(MenuViewController) {
            println("yes it is")
        }
    } 
}

Ответ 4

Мне пришлось найти текущий viewController в AppDelegate. Я использовал этот

//at top of class
var window:UIWindow?

// inside my method/function
if let viewControllers = window?.rootViewController?.childViewControllers {
    for viewController in viewControllers {
        if viewController.isKindOfClass(MyViewControllerClass) {
            println("Found it!!!")
            }
        }
    }

Ответ 5

Попробуйте это

if self is MyViewController {        

}

Ответ 6

Чтобы выйти из ответа Thapa, вам нужно передать класс viewcontroller перед использованием...

   if let wd = self.view.window {
        var vc = wd.rootViewController!
        if(vc is UINavigationController){
            vc = (vc as! UINavigationController).visibleViewController
        }
        if(vc is customViewController){
            var viewController : customViewController = vc as! customViewController

Ответ 7

Swift 3

Не уверен, что вы, ребята, но мне сложно с этим справиться. Я сделал что-то вроде этого:

if let window = UIApplication.shared.delegate?.window {
    if var viewController = window?.rootViewController {
        // handle navigation controllers
        if(viewController is UINavigationController){
            viewController = (viewController as! UINavigationController).visibleViewController!
        }
        print(viewController)
    }
}

Я продолжал получать начальный контроллер представления своего приложения. По какой-то причине он хотел остаться контроллером корневого представления, несмотря ни на что. Поэтому я просто создал глобальную переменную типа строки currentViewController и сам установил ее значение в каждом viewDidLoad(). Все, что мне было нужно, это сказать, на каком экране я был, и это отлично работает для меня.

Ответ 8

Для типов вы можете использовать is, и если это ваш собственный класс viewcontroller, вам нужно использовать isKindOfClass как:

let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
            if vcOnTop.isKindOfClass(VcShowDirections){
                return
            }

Ответ 9

Swift 3 | Проверьте, является ли контроллер представления корнем изнутри.

Вы можете получить доступ к window с помощью контроллера просмотра, вам просто нужно использовать self.view.window.

Контекст: мне нужно обновить положение представления и вызвать анимацию при повороте устройства. Я хочу сделать это только в том случае, если контроллер вида активен.

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(
            self, 
            selector: #selector(deviceDidRotate), 
            name: .UIApplicationDidChangeStatusBarOrientation, 
            object: nil
        )
    }

    func deviceDidRotate() {
        guard let window = self.view.window else { return }

        // check if self is root view controller
        if window.rootViewController == self {
            print("vc is self")
        }

        // check if root view controller is instance of MyViewController
        if window.rootViewController is MyViewController {
            print("vc is MyViewController")
        }
    }
}

Если вы вращаете свое устройство, пока MyViewController активен, вы увидите, что указанные выше строки печатаются на консоли. Если MyViewController неактивен, вы их не увидите.

Если вам интересно, почему я использую UIDeviceOrientationDidChange вместо .UIDeviceOrientationDidChange, посмотрите этот ответ.

Ответ 10

let viewControllers = navController?.viewControllers
        for aViewController in viewControllers! {

            if aViewController .isKind(of: (MyClass?.classForCoder)!) {
                _ = navController?.popToViewController(aViewController, animated: true)
            }
        }

Ответ 11

if let index = self.navigationController?.viewControllers.index(where: { $0 is MyViewController }) {
            let vc = self.navigationController?.viewControllers[vcIndex] as! MyViewController
            self.navigationController?.popToViewController(vc, animated: true)
        } else {
            self.navigationController?.popToRootViewController(animated: true)
        }

Ответ 12

Проверьте, чтобы это работало лучше для меня Что такое .self

if ((self.window.rootViewController?.isKind(of: WebViewController.self))!)
{
  //code
}