Google Drive OAuthをラップするUinavigationControllerにUINavigationItemを追加します
質問
目標: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
インスタンスのUINavigationController
にnavController
を追加しようとしましたが、これは機能しませんが、NIBファイルGtmoauth2ViewTouch.xibの2つの小さなボタン(<と>)を持つUIView
で貼られているようです。下記の...
GTLファイルGTMOAuth2ViewControllerTouch.m
を読み込んで、使用可能な方法があるかどうか、またはサブクラス化によって上書きできるかどうかを確認しますが、これを行う試みには確信していません。
私の最善の推測は、このコードによって設定されたOAuth View ControllerをGTMOAuth2ViewControllerTouch.m
...
- (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メソッドは、親ビューコントローラから呼び出されます。