将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController
题
目标: :要连接到 iOS Google Drive,请将 iOS Google OAuth 视图控制器包装在以编程方式创建的导航控制器中,并添加取消按钮以使用户能够取消 Google OAuth 进程(如果他们选择这样做)。
问题: :虽然我可以成功地将 OAuth 视图控制器包装在导航控制器中,但我似乎无法添加导航项,例如所需的“取消”按钮。
我添加了一个包装 Google Drive OAuth 视图控制器的导航控制器,如下所示...
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
, ,但是这不起作用,相反我似乎被困住了 UIView
笔尖文件 GTMOAuth2ViewTouch.xib 中有两个小按钮(< 和 >),图像如下...
我已通读 GTL 文件 GTMOAuth2ViewControllerTouch.m
尝试查看是否有我可以使用的方法或者是否可以通过子类化来覆盖,但我对自己的尝试没有信心。
我最好的猜测是任何包装 OAuth 视图控制器的导航控制器都由此代码设置 GTMOAuth2ViewControllerTouch.m
...
- (void)setUpNavigation {
rightBarButtonItem_.customView = navButtonsView_;
self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
}
请帮忙?
解决方案
这是我的重新解读 伊姆兰·汗在他对这个堆栈溢出问题的回答中提供了出色的答案: Google 云端硬盘 iOS SDK:显示取消登录按钮
这 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 方法是从父视图控制器调用的。