質問

目標:iOS Googleドライブへの接続のために、プログラムで作成されたナビゲーションコントローラにiOS Google OAuth Viewコントローラをラップし、ユーザーがGoogle OAuthプロセスをキャンセルできるようにキャンセルボタンを追加します。彼らはそうすることを選びます。

問題:ナビゲーションコントローラにOAuth View Controllerを正常に折り返すことはできませんが、必要なキャンセルボタンなどのナビゲーション項目を追加することはできません。

次のように、GoogleドライブOAuth View Controllerをラップするナビゲーションコントローラを追加します。

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];
}
.

明確にするために、変数parentTVCはパブリックプロパティ、

です。
@property (nonatomic, strong) UITableViewController *parentTVC;
.

とカスタムinitメソッドを使って次のように設定されています...

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

    return self;
}
.

UINavigationItemインスタンスのUINavigationControllernavControllerを追加しようとしましたが、これは機能しませんが、NIBファイルGtmoauth2ViewTouch.xibの2つの小さなボタン(<と>)を持つUIViewで貼られているようです。下記の...

gtmoauth2viewtouch.xib

GTLファイルGTMOAuth2ViewControllerTouch.mを読み込んで、使用可能な方法があるかどうか、またはサブクラス化によって上書きできるかどうかを確認しますが、これを行う試みには確信していません。

私の最善の推測は、このコードによって設定されたOAuth View ControllerをGTMOAuth2ViewControllerTouch.m ...

から設定されたNavigation Controllerが包装することです。
- (void)setUpNavigation {
  rightBarButtonItem_.customView = navButtonsView_;
  self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}
.

援助してください?

役に立ちましたか?

解決

これは私の再解釈です Imran Khan 'sこのスタックのオーバーフローへの返答に含まれています質問: GoogleドライブiOS SDK:ディスプレイキャンセルログインボタン < / P>

googleAuthCheckメソッドは、親ビューコントローラのViewDidLoadまたはViewWillAppearメソッドのいずれかで呼び出す必要があります。 (私はここでiOS Google Drive SDKの合理的な理解を想定しているので、さらなる説明を追加する必要があるかどうかを教えてください。)

また、initWithBarButtonSystemItem:UIBarButtonSystemItemCancelを使用すると、ビューコントローラのタイトルテキストのみがローカライズされる必要があります(ローカライズを実装している場合)。

- (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];
    }
}
.

明確にするためにbuttonCancelTapped:メソッドは以下の通りです...

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

明確にするための、変数parentTVCはパブリックプロパティ、

です。
@property (nonatomic, strong) UITableViewController *parentTVC;
.

とカスタムinitメソッドを使って次のように設定されています...

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

    return self;
}
.

このカスタムinitメソッドは、親ビューコントローラから呼び出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top