2014-12-31 2 views
41

Насколько я знаю, это будет работать в Objective-C:Как проверить текущий класс контроллера вида в Swift?

self.window.rootViewController.class == myViewController 

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

+0

Вы пытаетесь определить, является ли это экземпляром определенного класса или конкретного экземпляра? – mc01

+0

Экземпляр класса – user83039

ответ

45

Чтобы проверить класс в Swift, используйте "is" (as explained under "checking Type" in the chapter called Type Casting in the Swift Programming Guide)

if self.window.rootViewController is MyViewController { 
    //do something if it's an instance of that class 
} 
+2

Переменная 'self.window' не существует – user83039

+0

@ user83039 Что такое' self' в этом случае? Где вы помещаете код? self.window и rootViewController находятся в AppDelegate. Нужна дополнительная информация. – mc01

+0

Я внутри контроллера вида. – user83039

23

Обновление для 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 
     } 
    } 
+0

Нет такой вещи, как self.window – user83039

+1

Вы в AppDelegate? если нет, вы можете получить свой AppDelegate и сделать что-то подобное. –

+2

Удивительно, это сработало для меня. Просто вместо 'self.window' использовать' self.view.window' – Coltrane

2

Попробуйте

if self is MyViewController {   

} 
+0

self не обязательно то, что отображается, если я использую функцию из другого класса ... – user83039

13

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

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

У меня нет объекта, в текущем окне должен быть объектом. – user83039

+1

Использовать self.isKindOfClass then –

+1

self не обязательно то, что отображается, если я использую эту функцию из другого класса ... – user83039

8

Мне нужно было найти текущий 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!!!") 
      } 
     } 
    } 
4

Чтобы уйти от ответа Тапа, вы должны бросить в класс 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 
0

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

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

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, посмотрите на this answer.

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

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

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().Все, что мне было нужно, это сказать, на каком экране я был на &, это отлично работает для меня.

Смежные вопросы