我需要打开谷歌登录viewController作为一个模态从现有的viewController。没关系,但我不知道如何添加按钮来关闭模态因为我没有使用UINavigationController。有人遇到同样的问题吗?
GTMOAuth2ViewControllerTouch *viewController;
viewController = [GTMOAuth2ViewControllerTouch controllerWithScope:GOOGLE_SCOPE_YOUTUBE
clientID:GOOGLE_CLIENT_ID
clientSecret:GOOGLE_CLIENT_SECRET
keychainItemName:GOOGLE_KEYCHAIN
delegate:self
finishedSelector:finishedSel];
NSDictionary *params = [NSDictionary dictionaryWithObject:@"es" forKey:@"hl"];
viewController.signIn.additionalAuthorizationParameters = params;
viewController.signIn.shouldFetchGoogleUserProfile = YES;
NSString *html = @"<html><body style="font-family:Arial"><div style="text-align:center;">Cargando página para iniciar sesión...</div></body></html>";
viewController.initialHTMLString = html;
[self presentViewController:viewController animated:NO completion:nil];
谢谢
我有同样的问题,最后使用
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.75];
[self.navigationController pushViewController:detailView animated:NO];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.navigationController.view cache:NO];
[UIView commitAnimations];
但这不是完美的解决方案(非常丑陋和非平面)。我想知道为什么导航栏不显示
[self presentViewController:viewController animated:NO completion:nil];
是的,我们可以手动添加导航栏
UINavigationBar *navBar=[etc…
我认为完美的解决方案是使用新的UIViewTransitions(苹果想强迫我们使用这个?)。
这是我对Imran Khan在他对这个堆栈溢出问题的回答中提供的出色答案的重新解释:Google Drive iOS SDK:显示取消登录按钮
去那里给他的回答投票,我只是复制和转换。
if (!self.isAuthorized) {
SEL selectorFinish = @selector(viewController:finishedWithAuth:error:);
SEL selectorButtonCancel = @selector(buttonCancelTapped:);
UINavigationController *navController = [[UINavigationController alloc] init];
UINavigationBar *navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 63)];
UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:<<localised string for title>>];
UIBarButtonItem *barButtonItemCancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:selectorButtonCancel];
[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方法是从父视图控制器调用的。
Swift版本-针对新用户
扩展GTMOAuth2ViewControllerTouch
类
extension GTMOAuth2ViewControllerTouch
{
public override func viewDidLoad()
{
super.viewDidLoad()
let cancelItem = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: #selector(self.cancelGdriveSignIn))
self.navigationController?.navigationBar.topItem?.rightBarButtonItem = cancelItem
self.navigationController?.navigationBar.topItem?.title = "Google Drive"
}
func cancelGdriveSignIn()
{
self.dismissViewControllerAnimated(true, completion: nil)
}
}
并在返回AuthController之前添加导航控制器
private func createAuthController() -> UIViewController {
let scopeString = scopes.joinWithSeparator(" ")
let controller = GTMOAuth2ViewControllerTouch(scope: scopeString, clientID: kClientID, clientSecret: nil, keychainItemName: kKeychainItemName, delegate: self, finishedSelector: #selector(ViewController.viewController(_:finishedWithAuth:error:)))
let navController = UINavigationController(rootViewController: controller)
return navController
}
很有魅力