2014-03-29 156 views
2

我想在iOS應用程序中設置首次啓動視圖。要做到這一點,我有以下代碼允許我在第一次啓動應用程序時執行代碼。以編程方式設置/激活Segue

我想要的是當應用程序第一次啓動時,用戶被髮送到我在Storyboards中設置的FirstLaunch視圖,而不是FirstView視圖。每次連續啓動都會將用戶發送到FirstLaunch視圖。

目前,我有這個代碼在NavigationController.m執行,但如果這將在AppDelegate.m執行更好,我可以改變它。

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLaunch"]) 
{ 
    // not first launch 
} 
else 
{ 
    // first launch 

    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstLaunch"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

我的問題是:如何設置一個賽格瑞,通過編程(或激活SEGUE)向用戶發送到FirstLaunch視圖,而不是正常的firstView?

回答

0

你不需要一個segue - 所有你需要的是一種方式來選擇初始視圖控制器編程方式,基於它是否是第一次啓動。

爲了做到這一點,取消「是初始視圖控制器」,在故事板在您FirstView,並改變應用程序委託如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 
    // Use the name of your storyboard below 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil]; 
    NSString *initialId; 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLaunch"]) { 
     // not first launch 
     initialId = @"FirstViewController"; 
    } else { 
     // first launch 
     initialId = @"FirstLaunchViewController";  
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"FirstLaunch"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
    self.window.rootViewController = [storyboard instantiateViewControllerWithIdentifier:initialId]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

上面的代碼中嵌入的代碼,決定如果這是一個首先啓動或不啓動,並根據此決定設置目標屏幕的故事板標識符。

請注意,即使他第一次出現時沒有機會好好看一眼(例如因爲有人打電話給他,或者該設備耗盡電池電量)。更好的方法是按照與您相同的方式讀取NSUserDefaults,但只有在第一個啓動控制器被用戶解僱時纔將其設置爲YES。這樣你就可以確定用戶有足夠的時間看到屏幕並與之交互。

+0

對於故事板的名稱:我有一個名爲'Main.storyboard'的故事板,我是否也應該插入前綴(.Storyboard)?另外,對於'//不首次啓動',如果我已經將它設置爲Storyboard中的默認視圖,那麼將初始視圖控制器設置爲'FirstViewController'甚至是必要的? – Michael

+0

@James爲了使這個技巧發揮作用,你需要取消設置'FirstViewController'作爲故事板中的默認視圖。您不會將'.storyboard'傳遞給'storyboardWithName:'方法 - 只應傳遞「@」Main「。 – dasblinkenlight

+0

@dasklinkenlight即使在測試這個代碼時只是要求它發送到'FirstLaunchViewController',它就會崩潰;以及普通的'FirstViewController'視圖 - 儘管它可能與我目前用於我的項目的設置有關。 – Michael

0

在您的故事板設置segue標識符您需要(選擇segue並選擇屬性檢查器)。

在此之後,你可以調用賽格瑞編程:

[self performSegueWithIdentifier:@"indentifier" sender:nil]; 
0

這口井在賽格瑞解釋文章會回答你的問題,激活並與賽格瑞傳遞數據的

http://www.appcoda.com/storyboards-ios-tutorial-pass-data-between-view-controller-with-segue/

樣本塊:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"showRecipeDetail"]) { 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     RecipeDetailViewController *destViewController = segue.destinationViewController; 
     destViewController.recipeName = [recipes objectAtIndex:indexPath.row]; 
    } 
}