我一直在寻找一种使用Storyboard以编程方式设置初始视图控制器的方法。我找到了这个解决方案:Programmatically set the initial view controller using Storyboards
这个作品只是喜欢我想要的但是在使用该主题中提供的Swift答案之后:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var exampleViewController: ExampleViewController = mainStoryboard.instantiateViewControllerWithIdentifier("ExampleController") as! ExampleViewController
self.window?.rootViewController = exampleViewController
self.window?.makeKeyAndVisible()
return true
}
第一次加载视图时,以前工作的框架将不再起作用:SwiftLoader。 https://github.com/leoru/SwiftLoader
然而,当我第二次加载相同的视图时,SwiftLoader插件会被激活。
我像这样加载SwiftLoader:
SwiftLoader.show(title: "Loading...", animated: true)
我觉得它与上面的代码有关,创建了一个UIWindow,而不是任何故事板(UIView?),但我不知道如何解决这个问题?
答案 0 :(得分:3)
SwiftLoader使用应用程序的关键窗口显示。见this source code:
var currentWindow : UIWindow = UIApplication.sharedApplication().keyWindow!
// […snip…]
loader.coverView = UIView(frame: currentWindow.bounds)
loader.coverView?.backgroundColor = UIColor.clearColor()
if (loader.superview == nil) {
currentWindow.addSubview(loader.coverView!)
currentWindow.addSubview(loader)
loader.start()
} else {
loader.coverView?.removeFromSuperview()
}
因此,当您第一次激活SwiftLoader时,您的问题必须是另一个窗口是键窗口。
要检查这一点,请检查UIApplication.sharedApplication().keyWindow
并将其与UIApplication.sharedApplication().windows
数组进行比较,以查看应用中所有当前窗口的内容。最前面的UIWindow
将是此数组的最后一个元素。
非关键窗口可能是iOS键盘,警报视图等。
我修复了the SVProgressHUD library by implementing this code中的类似问题:
NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator];
for (UIWindow *window in frontToBackWindows){
BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen;
BOOL windowIsVisible = !window.hidden && window.alpha > 0;
BOOL windowLevelNormal = window.windowLevel == UIWindowLevelNormal;
if (windowOnMainScreen && windowIsVisible && windowLevelNormal) {
[window addSubview:self.overlayView];
break;
}
}
您可能希望更新SwiftLoader以使用更智能的逻辑(移植到Swift),或者允许您手动指定窗口。