在第一次应用启动时加载.nib

时间:2011-10-29 16:04:18

标签: objective-c uiviewcontroller nsuserdefaults

我想展示我在首次推出应用时制作的“简介”笔尖。

我在我的viewDidLoad中使用了以下代码,但它似乎什么也没做(甚至在ViewWillAppear中)。我试图清理,从模拟器和设备中删除应用程序并再次构建,但没有任何反应。

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
    if (![defaults objectForKey:@"firstRun"]){
        IntroViewController *intro = [[IntroViewController alloc] initWithNibName:nil bundle:nil];

        intro.modalTransitionStyle = UIModalTransitionStyleCoverVertical ;
        [self presentModalViewController:intro animated:YES];

        [intro release];

        [defaults setObject:[NSDate date] forKey:@"firstRun"];

    }
    [[NSUserDefaults standardUserDefaults] synchronize];

我还试图在首次发布时展示一点UIAlertView,它的确有效!我没有加载笔尖吗?

修改

我忘了说这是一个基于标签栏的应用程序,我在我的应用程序委托中有一些代码,用于在应用程序的前三个会话中突出显示行。 任何帮助表示赞赏!

5 个答案:

答案 0 :(得分:3)

好的,添加以下代码,它应该可以工作:

- (void)Loadview_afterdelay{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
    if (![defaults objectForKey:@"firstRun"]){
    IntroViewController *intro = [[IntroViewController alloc] initWithNibName:nil bundle:nil];

    intro.modalTransitionStyle = UIModalTransitionStyleCoverVertical ;
    [self presentModalViewController:intro animated:YES];

    [intro release];

    [defaults setObject:[NSDate date] forKey:@"firstRun"];

      }

   [[NSUserDefaults standardUserDefaults] synchronize];

}


- (void)viewDidLoad {

[self performSelector:@selector(Loadview_afterdelay) withObject:nil afterDelay:0.5];

 }

显然,在这种情况下,您无法在加载视图后立即加载第二个视图(viewdidload) 因此,您只需在加载第二个视图之前设置一个小延迟。

答案 1 :(得分:1)

尝试以下方法:

    IntroViewController *intro = [[IntroViewController alloc] initWithNibName:@"IntroViewController" bundle:nil];

    intro.modalTransitionStyle = UIModalTransitionStyleCoverVertical ;
    [self presentModalViewController:intro animated:YES];

    [intro release];

我已将.nib名称添加到initWithNibName

另外,如果你使用的是iOS 5(和ARC),你应该使用它:

    IntroViewController *intro = [[IntroViewController alloc] initWithNibName:@"IntroViewController" bundle:nil];

    intro.modalTransitionStyle = UIModalTransitionStyleCoverVertical ;
    [self presentModalViewController:intro animated:YES completion:nil];

答案 2 :(得分:0)

您是否尝试将其移至viewDidAppear?

答案 3 :(得分:0)

我认为您应该将该代码放在AppDelegate

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Modify the code above to what you need.
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
[application setStatusBarHidden:YES withAnimation:NO];
return YES;
}

在那里,您告诉您的应用程序从哪个视图开始。 所以第一次有一个firstTimeViewController。 如果您在这里这样做,请不要设置转换动画。 只是为过渡关闭动画。


设置断点并检查是否要进入viewDidLoad方法,如果是,请检查您的测试是否合适。
我建议也许在NSNumber中使用BOOL再次检查。

最重要的是,您可以考虑将其放在viewDidAppear中。

答案 4 :(得分:0)

由于@Louis已经很好地回答了这个问题,唯一的问题就是它只是与ARC不兼容,因为有一个[发布]我现在写的内容并不新,但我会更多地宣布它初学者。

首先,您必须在RootViewController.h中导入TourGuideViewController.h,它类似于:

#import <UIKit/UIKit.h>
#import "TourGuideViewController.h"

@interface RootViewController : UITabBarController
{
    TourGuideViewController *TourGuideViewController;
}

@property (nonatomic, strong) TourGuideViewController *TourGuideViewController;

@end

然后你必须在RootViewController.m文件中合成并实现你的函数:

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

@synthesize TourGuideViewController = _TourGuideViewController;

- (void)viewDidLoad
{
    [self performSelector:@selector(LoadTourGuide) withObject:nil afterDelay:0.5];
}

- (void)LoadTourGuide{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (![defaults objectForKey:@"FirstRun"]){
        TourGuideViewController *TourGuideVC = [self.storyboard instantiateViewControllerWithIdentifier:@"TourGuideViewController"];
        TourGuideVC.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
        [self presentViewController:TourGuideVC animated:YES completion:NULL];

        [defaults setObject:[NSDate date] forKey:@"FirstRun"];
    }

    [[NSUserDefaults standardUserDefaults] synchronize];
}

@end
相关问题