Question

But:Pour la connexion à iOS Google Drive, enveloppez le contrôleur de vue iOS Google OAuth dans un contrôleur de navigation créé par programme et ajoutez un bouton Annuler pour permettre à l'utilisateur d'annuler le processus Google OAuth, s'il choisit de le faire.

Problème:Bien que je parvienne à envelopper avec succès le contrôleur de vue OAuth dans un contrôleur de navigation, je n'arrive pas à ajouter un élément de navigation, tel que le bouton Annuler souhaité.

J'ajoute un contrôleur de navigation qui enveloppe le contrôleur de vue Google Drive OAuth, comme suit...

GTMOAuth2ViewControllerTouch *authViewController = nil;
if (!self.isAuthorized) {
    SEL selectorFinish = @selector(viewController:finishedWithAuth:error:);
    SEL selectorButtonCancel = @selector(buttonCancelTapped:);

    authViewController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive
                                                                    clientID:kClientID
                                                                clientSecret:kClientSecret
                                                            keychainItemName:kKeychainItemName
                                                                    delegate:self
                                                            finishedSelector:selectorFinish];

    UINavigationController *navController = [[UINavigationController alloc] init];

    [navController addChildViewController:authViewController];

    [self.parentTVC presentViewController:navController animated:YES completion:nil];
}

Pour plus de clarté, la variable parentTVC est un bien public,

@property (nonatomic, strong) UITableViewController *parentTVC;

et est défini à l'aide d'une méthode d'initialisation personnalisée, comme suit...

- (id)initWithParentTVC:(UITableViewController *)tvc {
    self = [super init];
    [self setParentTVC:tvc];

    return self;
}

J'ai tenté d'ajouter UINavigationItems au UINavigationController exemple navController, mais cela ne fonctionne pas et il me semble que je suis coincé avec le UIView avec les deux petits boutons (< et >) dans le fichier nib GTMOAuth2ViewTouch.xib, image incluse ci-dessous...

GTMOAuth2ViewTouch.xib

J'ai lu le fichier GTL GTMOAuth2ViewControllerTouch.m pour essayer de voir s'il existe une méthode que je pourrais utiliser ou si je peux la remplacer par un sous-classement, mais je ne suis pas sûr de mes tentatives pour le faire.

Ma meilleure hypothèse est que tout contrôleur de navigation encapsulant le contrôleur de vue OAuth défini par ce code à partir de GTMOAuth2ViewControllerTouch.m...

- (void)setUpNavigation {
  rightBarButtonItem_.customView = navButtonsView_;
  self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}

De l'aide s'il vous plaît ?

Était-ce utile?

La solution

C'est ma réinterprétation de Imran KhanExcellente réponse fournie dans sa réponse à cette question de débordement de pile : SDK Google Drive pour iOS :Afficher le bouton Annuler la connexion

Le googleAuthCheck La méthode doit être appelée dans la méthode viewDidLoad ou viewWillAppear du contrôleur de vue parent.(Je suppose ici une compréhension raisonnable du SDK iOS Google Drive, alors faites-moi savoir si j'ai besoin d'ajouter des précisions supplémentaires.)

De plus, bien que ce soit un petit problème, l'utilisation initWithBarButtonSystemItem:UIBarButtonSystemItemCancel nécessite que seul le texte du titre du contrôleur de vue doive ensuite être localisé (si vous implémentez la localisation).

- (void)googleAuthCheck {
    if (!self.isAuthorized) {
        SEL selectorFinish = @selector(viewController:finishedWithAuth:error:);
        SEL selectorButtonCancel = @selector(buttonCancelTapped:);

        UINavigationController *navController = [[UINavigationController alloc] init];

        UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:<<localised string for title>>];
        UIBarButtonItem *barButtonItemCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:selectorButtonCancel];
        UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 63)];

        [navigationItem setRightBarButtonItem:barButtonItemCancel];
        [navigationBar setTranslucent:NO];
        [navigationBar setItems:[NSArray arrayWithObjects: navigationItem,nil]];

        [navController.view addSubview:navigationBar];

        GTMOAuth2ViewControllerTouch *authViewController = nil;
        authViewController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive
                                                                        clientID:kClientID
                                                                    clientSecret:kClientSecret
                                                                keychainItemName:kKeychainItemName
                                                                        delegate:self
                                                                finishedSelector:selectorFinish];

        [navController addChildViewController:authViewController];

        [self.parentTVC presentViewController:navController animated:YES completion:nil];
    }
}

Pour plus de clarté, le buttonCancelTapped: la méthode est la suivante...

- (IBAction)buttonCancelTapped:(UIBarButtonItem *)sender {
    [self.parentTVC dismissViewControllerAnimated:YES completion:^(void){}];
}

Pour plus de clarté, la variable parentTVC est un bien public,

@property (nonatomic, strong) UITableViewController *parentTVC;

et est défini à l'aide d'une méthode d'initialisation personnalisée, comme suit...

- (id)initWithParentTVC:(UITableViewController *)tvc {
    self = [super init];
    [self setParentTVC:tvc];

    return self;
}

Cette méthode d'initialisation personnalisée est appelée depuis le contrôleur de vue parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top