2016-02-18 181 views
0

我使用下面的代碼來檢測應用程序是否爲首次運行:如何覆蓋初始視圖控制器上首次運行直通的AppDelegate

// Detect First Launch 

    let firstLaunch = NSUserDefaults.standardUserDefaults().boolForKey("FirstLaunch") 
    if firstLaunch { 
     print("Not first launch.") 
     Show() 
    } 
    else { 
     print("First launch, setting NSUserDefault.") 
     NSUserDefaults.standardUserDefaults().setBool(true, forKey: "FirstLaunch") 
    } 

我使用下面的函數來顯示的ViewController:

func Show(){ 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewControllerWithIdentifier(「myViewController」) as! MyViewController 
    self.window?.rootViewController?.presentViewController(vc, animated: true, completion: nil) 
} 

。我把代碼下:func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

然而,當我建立並運行應用程序,彷彿什麼都沒有發生的初始視圖控制器中。我希望「myViewController」顯示爲FIRST(在應用程序首次啓動時在設備上顯示)。然而,首次啓動後,「myViewController」將不再顯示,除非用戶卸載並重新安裝應用程序。

有誰知道該怎麼做?

+0

您是否在尋找'myViewController',然後將其關閉到通常是根的視圖控制器,或者您想要替換通常的根? –

+0

@ konrad.bajtyngier,我需要第一個選項。我期待提供'myViewController'並關閉它以顯示實際的根目錄,而不是替換它。我只需要在第一次啓動時調用它.. – pinkBlossoms7

+0

@ pinkBlossoms7當您安裝應用程序時,firstLaunch爲false,應用程序不會調用Show,除了第一次啓動以外,myViewController會顯示。 – Ethan

回答

1

既然你想顯示第一次啓動自定義屏幕,然後關閉它,我會在你的正常根VC的viewWillAppear(animated:Bool)方法

EDIT運行這段代碼:

是的,你會必須稍微修改代碼。例如,如下所示:

func Show(){ 
    guard let sb = storyboard else { return } 
    let vc = sb.instantiateViewControllerWithIdentifier(「myViewController」) as! MyViewController 
    navigationController?.presentViewController(vc, animated: true, completion: nil) 
} 
+0

我在'self.window?.rootViewController?.presentViewController(vc,animated:true,completion:nil)中得到一個錯誤''說'// viewController沒有成員'window'' ..我應該如何替換它? – pinkBlossoms7

+0

我用'presentViewController(vc,animated:true,completion:nil)'取代它,它工作,謝謝! – pinkBlossoms7

+0

很高興它的工作,但看看我編輯的答案。更好的方式來獲得你的故事板。 –

0

將該值設置爲用戶默認值後,必須使用synchronize方法保存該值。定期調用此方法購買系統,但如果在調用之前未同步,則不會保存您的值。從蘋果文檔的synchronize

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "FirstLaunch") 
NSUserDefaults.standardUserDefaults().synchronize() 

文檔:

寫入任何修改永久域名到磁盤,並更新所有未修改的持久域,什麼是在磁盤上。

討論

因爲這個方法是每隔一段時間自動調用,使用此方法僅如果你不能等待自動同步(例如,如果你的應用程序即將退出),或者如果你想即使您沒有進行任何更改,也會將用戶默認更新爲磁盤上的內容。