从应用程序委托中呈现视图控制器
从应用程序委托中呈现视图控制器
我正在尝试使用以下代码从应用程序委托中呈现一个视图控制器:
- (void)interstitialViewControllerRequestSucceeded:(UIViewController *)interstitialViewController { [self.window.rootViewController presentViewController:(UIViewController *)interstitialViewController animated:YES completion:NULL]; }
它将在初始视图控制器上显示插页广告,但在其他视图控制器上不显示。我希望它能在与导航控制器相关联的每一个视图控制器上显示。
如何修改这段代码以实现这个目标?
问题的原因是当前的代码中使用了一个不推荐的方法来从应用程序委托中呈现视图控制器。这种方法只适用于初始视图控制器,而无法获取当前导航控制器并从那里呈现视图。
解决方法是使用以下代码来获取当前的导航控制器并从那里呈现视图:
UIViewController *currentViewController = [UIApplication sharedApplication].keyWindow.rootViewController; UINavigationController *navigationController = currentViewController.navigationController; [navigationController presentViewController:yourViewController animated:YES completion:nil];
这样,您就可以从当前的导航控制器中呈现视图,并且不再需要使用不推荐的方法。
Present view controller from app delegate的问题是在应用程序的代理类中无法直接呈现(present)视图控制器。这个问题可能出现的原因是在应用程序的生命周期中,视图控制器的层次结构还没有完全建立,因此无法直接访问和呈现视图控制器。
为了解决这个问题,可以使用以下方法:
Swift 3版本的解决方法是使用UIApplication.shared.keyWindow?.rootViewController
。
这个方法将返回应用程序的主窗口(key window)的根视图控制器(root view controller)。通过这个根视图控制器,我们可以访问整个视图控制器层次结构,并且可以使用present(_:animated:completion:)
方法来呈现新的视图控制器。
下面是一个示例代码,演示了如何在应用程序的代理类中呈现一个新的视图控制器:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// 创建一个新的视图控制器
let viewController = MyViewController()
// 获取主窗口的根视图控制器
if let rootViewController = UIApplication.shared.keyWindow?.rootViewController {
// 使用根视图控制器来呈现新的视图控制器
rootViewController.present(viewController, animated: true, completion: nil)
}
return true
}
通过使用UIApplication.shared.keyWindow?.rootViewController
方法,我们可以在应用程序的代理类中成功呈现一个新的视图控制器。这样,我们就可以在应用程序启动时执行一些初始化操作,同时显示一个新的视图控制器给用户。
问题:Present view controller from app delegate
出现原因:在应用程序委托中呈现视图控制器时发生了问题。
解决方法:使用UIApplication.shared.windows.first?.rootViewController来呈现视图控制器。
在Swift 5及更高版本中,可以通过以下代码来解决问题:
UIApplication.shared.windows.first?.rootViewController
在应用程序委托中,我们可以使用上述代码来获取应用程序的主窗口,并从中获取根视图控制器。然后,可以使用根视图控制器来呈现其他视图控制器。
这种方法可以确保我们从应用程序委托中正确地呈现视图控制器,而不会导致任何问题。