Насколько я знаю, это будет работать в Objective-C:
self.window.rootViewController.class == myViewController
Как проверить, является ли текущий контроллер представления конкретным?
Насколько я знаю, это будет работать в Objective-C:
self.window.rootViewController.class == myViewController
Как проверить, является ли текущий контроллер представления конкретным?
Чтобы проверить класс в Swift, используйте "is" (как описано в разделе "Тип проверки" в главе "Тип заливки в руководстве по программированию Swift" )
if self.window.rootViewController is MyViewController {
//do something if it an instance of that class
}
Обновлен для компилятора 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
}
}
Вы можете легко перебирать свои контроллеры, если используете навигационный контроллер. И тогда вы можете проверить конкретный экземпляр как:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
Мне пришлось найти текущий 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!!!")
}
}
}
Попробуйте это
if self is MyViewController {
}
Чтобы выйти из ответа 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
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()
. Все, что мне было нужно, это сказать, на каком экране я был, и это отлично работает для меня.
Для типов вы можете использовать is
, и если это ваш собственный класс viewcontroller, вам нужно использовать isKindOfClass
как:
let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
if vcOnTop.isKindOfClass(VcShowDirections){
return
}
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
, посмотрите этот ответ.
let viewControllers = navController?.viewControllers
for aViewController in viewControllers! {
if aViewController .isKind(of: (MyClass?.classForCoder)!) {
_ = navController?.popToViewController(aViewController, animated: true)
}
}
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)
}
Проверьте, чтобы это работало лучше для меня Что такое .self
if ((self.window.rootViewController?.isKind(of: WebViewController.self))!)
{
//code
}