web-dev-qa-db-fra.com

Afficher l'écran lors du premier lancement uniquement sous iOS

Tweetbot et Clear montrent au premier démarrage de l'application un petit écran de tutoriel sur le fonctionnement de l'application. L'écran avec le petit tutoriel ne s'affiche que lors du premier démarrage de l'application (1 fois)

Comment et avec quoi puis-je faire une chose semblable? Quelqu'un peut-il me pousser dans la bonne direction?

Voir je veux dire: 

enter image description here

29
Frenck

Dans votre viewDidLoad:

if (![@"1" isEqualToString:[[NSUserDefaults standardUserDefaults]
                                objectForKey:@"aValue"]]) {
    [[NSUserDefaults standardUserDefaults] setValue:@"1" forKey:@"aValue"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    //Action here

}
33
Blazer

Je suppose que par Xcode, vous voulez dire iOS.

Ce que vous devez faire, c'est utiliser la classe NSUserDefaults pour stocker un indicateur indiquant si l'utilisateur a déjà vu l'écran du didacticiel. 

Lorsque votre application est chargée pour la première fois (ou au moment où vous souhaitez décider d'afficher ou non l'écran du didacticiel), procédez comme suit:

if(![[NSUserDefaults standardUserDefaults] boolForKey:@"hasSeenTutorial"])
    [self displayTutorial];

Ceci vérifie les NSUserDefaults enregistrés pour l'utilisateur actuel pour une valeur nommée "hasSeenTutorial", qui n'existe pas encore. Comme il n'existe pas, il va appeler displayTutorial. displayTutorial fait référence à votre méthode de création de la vue de tutoriel. Vous pouvez comprendre cette partie.

Ensuite, une fois que l'utilisateur ferme l'écran du didacticiel:

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasSeenTutorial"];

Cette valeur sera sauvegardée pour votre profil utilisateur. Cela signifie que la prochaine fois qu'il le vérifiera, ce sera vrai, donc displayTutorial ne sera pas appelé.

53
chroipahtz

Bien entendu, si nous souhaitons informer l’utilisateur des fonctionnalités après la mise à jour (non seulement l’application lancée pour la première fois), la solution ci-dessous pourrait convenir.

Dans votre viewDidLoad:

NSString *currentBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
NSString *previousBundleVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"PreviousBundleVersion"];

if (![currentBundleVersion isEqualToString:previousBundleVersion] ) {
     // Here you can initialize your introduction view and present it!
}

Une fois que l'utilisateur ferme l'intro:

NSString *currentBundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];    
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:currentBundleVersion forKey:@"PreviousBundleVersion"];
    [standardUserDefaults synchronize];
}

Dans ce cas, la version de l'ensemble d'applications stockée dans votre standardUserDefaults diffère de la version actuelle de l'ensemble uniquement après la mise à jour et n'est affichée qu'une seule fois, ainsi qu'au premier lancement.

9
Dmitry Varavkin

Initialisez vos valeurs utilisateur par défaut avec un BOOL, quelque chose appelé instructionsSeen (ou ce que vous voulez) et réglez-le sur NO dans la méthode d'initialisation de votre délégué d'Application. Dans votre application, testez cette valeur et affichez votre écran de tutoriel s'il s'agit de NO. Pour afficher et afficher cet écran, définissez instructionsSeen sur YES et enregistrez-le dans vos paramètres par défaut. 

De cette façon, l'écran de démonstration ne s'affichera qu'au premier lancement, à moins que l'utilisateur ne désinstalle et installe l'application à nouveau.

Vous pouvez également montrer la démo pour un petit nombre de lancements (disons 3). Dans ce cas, n'utilisez pas BOOL, utilisez un nombre et augmentez-le à la place.

3
Abizern

Version Xamarin.iOS dans AppDelegate:

UIStoryboard storyboard = UIStoryboard.FromName("Main", null);

        if (NSUserDefaults.StandardUserDefaults.BoolForKey ("hasSeenTutorial") == false) {
            UIViewController vc = storyboard.InstantiateViewController ("StartPageViewController");
            this.Window.RootViewController = vc;

        } else {
            UIViewController vc = storyboard.InstantiateViewController ("NonStartPageViewController");
            this.Window.RootViewController = vc;

        }

        this.Window.MakeKeyAndVisible ();

Dans mon StartPageViewController, j'ai un bouton qui définit NSUserDefaults sur true. Ainsi, lors de sa prochaine exécution, il démarrera avec NonStartPageViewController:

partial void RegisterButton_TouchUpInside (UIButton sender)
    {
        NSUserDefaults.StandardUserDefaults.SetBool(true,"hasSeenTutorial");
        NSUserDefaults.StandardUserDefaults.Synchronize();
    }
2
pkozlowski
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"firstRun"]) {
    [defaults setObject:[NSDate date] forKey:@"firstRun"];
    [self displayTutorial];
}
1
user1215486

Version rapide: 

if !(NSUserDefaults.standardUserDefaults().boolForKey("seenTutorial")) {
            //Tutorial part
            NSUserDefaults.standardUserDefaults().setBool(true, forKey: "seenTutorial")
        }
0
PoolHallJunkie

Tout le monde fait cela plus complexe et vauge qu'il ne devrait être ... Solution complète simple.

Dans le ViewDidLoad:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"FirstLoadKey"]) {
    self.imageView.hidden = YES;
}else{
    self.imageView.hidden = NO;
    [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"FirstLoadKey"];
    [[NSUserDefaults standardUserDefaults]synchronize];
}
0
Jeff