我试图提出一个数据模型中ViewController
是否有任何已保存的数据.但是我收到以下错误:
警告:尝试显示其视图不在窗口层次结构中的*on*
相关代码:
override func viewDidLoad() { super.viewDidLoad() loginButton.backgroundColor = UIColor.orangeColor() var request = NSFetchRequest(entityName: "UserData") request.returnsObjectsAsFaults = false var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) var context:NSManagedObjectContext = appDel.managedObjectContext! var results:NSArray = context.executeFetchRequest(request, error: nil)! if(results.count <= 0){ print("Inga resultat") } else { print("SWITCH VIEW PLOX") let internVC = self.storyboard?.instantiateViewControllerWithIdentifier("internVC") as internViewController self.presentViewController(internVC, animated: true, completion: nil) } }
我尝试过使用谷歌找到的不同解决方案但没有成功.
在目标c:当在mpmovieplayer上呈现viewcontroller时,这解决了我的问题
- (UIViewController*) topMostController { UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; while (topController.presentedViewController) { topController = topController.presentedViewController; } return topController; }
斯威夫特3
我有这个不断出现作为一个新手,并发现当前加载模态视图,可以被解雇,但切换到根控制器是最好的,如果你不需要显示模态.
我正在使用它
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard?.instantiateViewController(withIdentifier: "MainAppStoryboard") as! TabbarController present(vc, animated: false, completion: nil)
使用它来代替我的tabController:
let storyboard = UIStoryboard(name: "Main", bundle: nil) let view = storyboard.instantiateViewController(withIdentifier: "MainAppStoryboard") as UIViewController let appDelegate = UIApplication.shared.delegate as! AppDelegate //show window appDelegate.window?.rootViewController = view
如果您需要在多个故事板屏幕之间切换,只需调整到视图控制器即可.
你只需要执行一个延迟选择器 - (0秒工作).
override func viewDidLoad() { super.viewDidLoad() perform(#selector(presentExampleController), with: nil, afterDelay: 0) } @objc private func presentExampleController() { let exampleStoryboard = UIStoryboard(named: "example", bundle: nil) let exampleVC = storyboard.instantiateViewController(withIdentifier: "ExampleVC") as! ExampleVC present(exampleVC, animated: true) }
此时,在代码中,视图控制器的视图仅已创建,但未添加到任何视图层次结构中.如果你想尽快从那个视图控制器出现,你应该做到viewDidAppear
最安全.
对于SWIFT
func topMostController() -> UIViewController { var topController: UIViewController = UIApplication.sharedApplication().keyWindow!.rootViewController! while (topController.presentedViewController != nil) { topController = topController.presentedViewController! } return topController }
斯威夫特3.
调用此函数以获取最顶层的视图控制器,然后使该视图控制器存在.
func topMostController() -> UIViewController { var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController! while (topController.presentedViewController != nil) { topController = topController.presentedViewController! } return topController }
用法:
let topVC = topMostController() let vcToPresent = self.storyboard!.instantiateViewController(withIdentifier: "YourVCStoryboardID") as! YourViewController topVC.present(vcToPresent, animated: true, completion: nil)
斯威夫特4
func topMostController() -> UIViewController { var topController: UIViewController = UIApplication.shared.keyWindow!.rootViewController! while (topController.presentedViewController != nil) { topController = topController.presentedViewController! } return topController }