2013-10-18 68 views
0

有不同的看法,我試圖讓我的應用程序啓動上它裝載了第一次不同的看法。 我現在有這個代碼,它實現了應用程序第一次啓動時應該發生的事情。 我有這段代碼加載在第一次運行

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    BOOL hasRunBefore = [defaults boolForKey:@"FirstRun"]; 

    if (!hasRunBefore) { 
    [defaults setBool:YES forKey:@"FirstRun"]; 
    [defaults synchronize]; 

//這裏有什麼?

else 
{ 
NSLog (@"Not the first time this controller has been loaded"); 

所以我應該在if語句中啓動一個不同的視圖控制器。但我應該放什麼?

+2

設置新視圖控制器RootViewController的self.window.rootViewController =新的視圖控制器 – prasad

+0

「發生的事情嗎?」 < - 無論你想在第一次運行期間發生什麼..;) –

+0

但是,我應該把我的if語句放在什麼代碼? –

回答

4

你沒有真正提供足夠的信息來正確地回答這個問題。答案可能取決於:

  • 你在使用故事板嗎?
  • Xib文件?
  • 全部代碼?

爲了論證的緣故,假設您沒有使用故事板,並且在應用程序委託中構建了視圖控制器。

你就在那裏檢查你第一次運行狀態,做好爲普拉薩德建議: (假設你重構你第一次運行檢查到應用程序委託一個單獨的方法) ...在didFinishLaunchingWithOptions:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
UIViewController* controller; 
if([self isFirstRun]) { 
    controller = [[MyFirstRunController alloc] init]; 
} else { 
    controller = [[MyStandardController alloc] init]; 
} 

[[self window] setRootViewController:controller]; 
[self.window makeKeyAndVisible]; 

。 ...

這是一種方式。另一個選項UIViewController提供了一個專門用於創建控制器視圖的loadView方法。因此,另一種方法是在應用程序委託中創建標準視圖控制器,然後在第一次運行時檢查控制器的loadView覆蓋。然後在那裏設置適當的視圖。

這真的取決於你第一次運行圖做什麼以及它是否需要它自己的控制器,也可以通過你的標準控制器來管理。只有你知道這一點。

如果你走後者的路線,你會做你這樣的標準控制器:

-(void)loadView { 
    UIView *rootView; 
    CGRect frame = [[UIScreen mainScreen] bounds]; 
    if([self isFirstRun]) { 
     rootView = [[MyFirstRunView alloc] initWithFrame:frame]; 
    } else { 
     rootView = [[MyStandardView alloc] initWithFrame:frame]; 
    } 

    [self setView:rootView]; 
} 

更新

如果從故事板加載,最好的辦法是保持你的「默認」控制器原樣並在視圖加載之前檢查您的第一次運行狀態,也許在viewWillAppear中 - 然後從故事板手動加載基於Storyboard的視圖控制器並以模態方式呈現。例如:

- (void)presentFirstRunViewController { 
    UIStoryboard *storyboard = self.storyboard; 
    FirstRunViewController *controller = [storyboard instantiateControllerWithIdentifier:@"FirstRunController"]; 

    // Configure the new controller 

    [self presentViewController:controller animated:YES completion:nil]; 
} 

一般來說,第一種方法(兩個控制器)是首選,因爲它更清晰地分離責任。但這確實取決於你的需求。

請確認代碼 - 輸入Windows機器(VS在Xcode粘貼)上...

+0

乾杯。我正在使用故事板,所以如何影響代碼 –

+0

我已經更新了我的答案,並提供了一些關於如何使用故事板處理此問題的指導 – Bladebunny

+0

已收到。非常感謝! –