Наскільки мені відомо, це могло б працювати в Objective-C:
self.window.rootViewController.class == myViewController
Як я можу перевірити, чи поточний контролер подання є певним?
Наскільки мені відомо, це могло б працювати в Objective-C:
self.window.rootViewController.class == myViewController
Як я можу перевірити, чи поточний контролер подання є певним?
Відповіді:
Щоб перевірити клас у Swift, використовуйте "є" (як це пояснено в розділі "Перевірка типу" в главі під назвою Type Casting у Посібнику з програмування Swift)
if self.window.rootViewController is MyViewController {
//do something if it's an instance of that class
}
self.window
не існує
self
в цьому випадку? Куди ви кладете код? self.window і rootViewController знаходяться в AppDelegate. Потрібна додаткова інформація.
Оновлено для компілятора 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
}
}
self.window
використанняself.view.window
Якщо ви використовуєте навігаційний контролер, ви можете легко переглядати свої контролери перегляду. І тоді ви можете перевірити конкретний екземпляр як:
if let viewControllers = navigationController?.viewControllers {
for viewController in viewControllers {
// some process
if viewController.isKindOfClass(MenuViewController) {
println("yes it is")
}
}
}
struct
всередину класу?
Мені довелося знайти поточний 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
Стрімкий 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
і якщо це ваш власний клас контролера перегляду, вам потрібно використовувати, isKindOfClass
як:
let vcOnTop = self.embeddedNav.viewControllers[self.embeddedNav.viewControllers.count-1]
if vcOnTop.isKindOfClass(VcShowDirections){
return
}
Свіфт 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)
}
Моя пропозиція - це варіація відповіді Кірана вище. Я використав це у проекті.
Стрімкий 5
// convenience property API on my class object to provide access to the my WindowController (MyController).
var myXWindowController: MyController? {
var myWC: MyController?
for viewController in self.windowControllers {
if ((viewController as? MyController) != nil) {
myWC = viewController as? MyController
break
}
}
return myWC
}
// example of use
guard let myController = myXWindowController else {
reportAssertionFailure("Failed to get MyXController from WindowController.")
return
}
var top = window?.rootViewController
while ((top?.presentedViewController) != nil) {
top = top?.presentedViewController
}
if !(type(of: top!) === CallingVC.self) {
top?.performSegue(withIdentifier: "CallingVC", sender: call)
}