簡體   English   中英

SwiftSpinner不再起作用

[英]SwiftSpinner no longer working

我一直在尋找一種使用Storyboards以編程方式設置初始視圖控制器的方法。 我找到了這個解決方案: 使用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的代碼有關,而不是與Storyboard以前用來做的任何事情(UIView?)有關,但是我不知道如何解決此問題?

SwiftLoader使用應用程序的鍵窗口顯示。 參見此源代碼

    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鍵盤,警報視圖等。

通過實現以下代碼解決了SVProgressHUD庫中的類似問題:

    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),或者允許您手動指定一個窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM