2014-02-11 66 views
1

我正在嘗試創建僅在應用程序首次打開時顯示的簡介/歡迎屏幕。我在用戶'chroipahtz'here的幫助下取得了一些成功,但只能看到黑色的視圖,而不是我的歡迎ViewController。注意:這個黑屏確實對我的應用程序的其餘部分沒有影響,並且應用程序運行時沒有錯誤或警告。顯示教程在第一個應用程序中查看僅顯示

screen shot of black screen

我在根視圖控制器「viewDidLoad中」的方法如下代碼:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"hasSeenTutorial"]) 
{ 
    WelcomeViewController *welcomeController = [[WelcomeViewController alloc] init]; 
    [self.navigationController pushViewController:welcomeController animated:YES]; 
} 
else{ NSLog(@"Tutorial has been seen");} 
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasSeenTutorial"]; 

,其顯示在第一開口引入視圖。我在故事板中創建了一個視圖控制器,並在身份檢查器中爲其分配了正確的自定義類。

screen shot of storyboard

我已經包括了頭:

#import "WelcomeViewController.h" 

請,如果你能,爲什麼歡迎視圖控制器界面不顯示文本的灰色觀點我在概述提供指導故事板。

+0

您應該檢查故事板中的WelcomeViewController標識。它應該被welcomeViewController寫爲@mikael代碼。 – Pawan

+0

你是說welcomeViewController是正確的,而不是WelcomeViewController?正如你在我的屏幕截圖中看到的那樣,該視圖被稱爲WelcomeViewController ...只是雙重檢查。 – Rwehner186

+0

我不能在故事板中看到其隱藏的身份。在自定義類下面。點擊它並給它一個故事板標識符(最好是你的課程名稱)。覈實。 – Pawan

回答

6

如果發生「其他」,您需要推送另一個視圖。下面的代碼更強大一些,並使用故事板。您必須命名爲這個視圖控制器和故事板工作:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{  
    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; 

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

    if(![[NSUserDefaults standardUserDefaults] dictionaryForKey:@"hasSeenTutorial"]){ 
     UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"welcomeViewController"]; 
     self.window.rootViewController = viewController; 
    } else { 
     UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"nonWelcomeViewController"]; 
     self.window.rootViewController = viewController; 
    } 

    [self.window makeKeyAndVisible]; 

    // Override point for customization after application launch. 

    return YES; 
} 
+0

我將上面的代碼複製到應用程序委託「 - (BOOL)應用程序:」部分和左storyboardWithName:@「主」作爲我的故事板是Main.storyboard。我還通過從視圖控制器標題複製和粘貼(以防止打字錯誤)將'welcomeViewController'更改爲'WelcomeViewController'和'nonWelcomeViewController'以適當的視圖控制器替代方案。在運行時,我得到錯誤「libC++ abi.dylib:終止於類型爲NSException的未捕獲異常」,這意味着IB連接中斷。任何建議? – Rwehner186

+0

'instantiateViewControllerWithIdentifier:@「welcomeViewController」指的是您可以在故事板中直接在身份檢查器中設置的故事板ID,而不是類名。 – Mika

+0

一旦我添加了這個代碼就成功了:[standardUserDefaults synchronize];謝謝! – Rwehner186

1

如何使ContainerViewController這樣

@interface ContainerViewController() 

@property (nonatomic) MainViewController *mainViewController 
@property (nonatomic) TutorialViewController *tutorialViewController 

@end 

@implementation ContainerViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)loadView 
{ 
    [super loadView]; 

    _mainViewController = [[MainViewController alloc] initWithNibName:nil bundle:nil]; 
    [self addChildViewController:_mainViewController]; 
    [self.view addSubview:_mainViewController.view]; 
    [_mainViewController didMoveToParentViewController:self]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view. 

    if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hasSeenTutorial"]) 
    { 
     [self showTutorialViewController]; 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasSeenTutorial"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
} 

- (void)showTutorialViewController 
{ 
    if (!_tutorialViewController) { 
     _tutorialViewController = [[TutorialViewController alloc] initWithNibName:nil bundle:nil]; 
    } 

    [self addChildViewController:_tutorialViewController]; 

    CGRect screenBounds = _mainViewController.view.bounds; 
    CGRect fromFrame = CGRectMake(0.0f, screenBounds.size.height, screenBounds.size.width, screenBounds.size.height); 
    CGRect toFrame = screenBounds; 

    _tutorialViewController.view.frame = fromFrame; 
    [self.view addSubview:_tutorialViewController.view]; 
    [UIView animateWithDuration:0.3f 
          delay:0.0f 
         options:UIViewAnimationOptionCurveEaseIn 
        animations:^{ 
         _tutorialViewController.view.frame = toFrame; 
        } completion:^(BOOL finished){ 
         [_tutorialViewController didMoveToParentViewController:self]; 
        }]; 
} 

請參閱Apple's document關於「ContainerViewController」。

而且你可以使用我的庫,它可以計算啓動次數。 請參閱this並嘗試如果你想。碰巧,我昨天做到了。

+0

感謝您的回覆。我從第一個[[NSUserDefaults standardUserDefaults]行刪除了雙重'::'。我還收到了'語義問題:缺少'['在'消息發送表達開始:「[[NSUserDefaults standardUserDefaults] synchronize];」警報胡蘿蔔指向第二個'['括號。建議補救? – Rwehner186

+0

對不起,'[[NSUserDefaults standardUserDefaults] setBool:YES forKey :: @「hasSeenTutorial」]'這一行有兩個錯誤。 ** FIRST **你在你的評論「::」中表示,這應該改爲「:」。 ** SECOND **你必須在行尾添加分號。請修復這兩個錯誤。 – ryutamaki

0

您已經在故事板中設置了一些視圖控制器,它是WelcomeViewController。但是這不適用於相反的方向。當你像你一樣初始化WelcomeViewController時,你只有該類的實例,它沒有連接到storyboard中的視圖控制器。

,你所要做的就是從這樣的故事板實例化視圖控制器:

UIStoryboard *storybrd = [UIStoryboard storyboardWithName:@"YourStoryBoardName"     bundle:nil]; 
UIViewController *mycontroller =[storybrd instantiateViewControllerWithIdentifier:@"identOfWelcomeViewController"]; 

當然,你必須正確識別器設置到故事板視圖控制器。

相關問題