将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController
Posted
技术标签:
【中文标题】将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController【英文标题】:Add UINavigationItem to UINavigationController that wraps Google Drive OAuth 【发布时间】:2014-04-11 03:34:47 【问题描述】:目标:为了连接到 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
s 添加到UINavigationController
实例navController
,但这不起作用,相反我似乎被UIView
与两个小按钮()卡住了在 nib 文件 GTMOAuth2ViewTouch.xib 中,图片包含在下面...
我已通读 GTL 文件 GTMOAuth2ViewControllerTouch.m
以尝试查看是否有可以使用的方法或是否可以通过子类化来覆盖,但我对自己的尝试没有信心。
我最好的猜测是任何导航控制器都包装了由GTMOAuth2ViewControllerTouch.m
...的代码设置的 OAuth 视图控制器...
- (void)setUpNavigation
rightBarButtonItem_.customView = navButtonsView_;
self.navigationItem.rightBarButtonItem = rightBarButtonItem_;
请帮忙?
【问题讨论】:
抱歉...刚刚在这里找到了答案:***.com/questions/21453691/… 请将您的答案标记为正确。会对其他人有所帮助。 谢谢@SHAD。我已经尝试过了,但显然我必须等待 2 天......?同时,为了确认,这个答案是正确的,并且在我的应用程序中有效。 【参考方案1】:这是我对Imran Khan 在回答此堆栈溢出问题时提供的出色答案的重新解释:Google Drive iOS SDK: Display Cancel Login Button
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;
这个自定义的初始化方法是从父视图控制器调用的。
【讨论】:
以上是关于将 UINavigationItem 添加到包装 Google Drive OAuth 的 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章
将 UINavigationItem 设置为 nil 后,如何重新添加它?
使用“模态推送”到 viewController 并且无法在顶部添加 UINavigationItem-(Controller, Bar)
UINavigationItem 后退按钮返回到上一个导航项,但视图没有改变