如何以编程方式在 iOS 中单击 facebook loginView?
Posted
技术标签:
【中文标题】如何以编程方式在 iOS 中单击 facebook loginView?【英文标题】:How programmatically click facebook loginView in iOS? 【发布时间】:2014-01-04 00:24:13 【问题描述】:我正在尝试在我的应用中添加一个 FBLoginView,如 here 所述。
FBLoginView *loginView = [[FBLoginView alloc] init];
[self.view addSubview:loginView];
其实我是打算通过设置来隐藏的
loginView.hidden = YES;
然后我想在发生其他一些事件时触发对loginView
的点击,类似于这篇文章所说的
Programmatically fire button click event?
但是 FBLoginView 没有收到按钮点击消息。还有没有办法做到这一点?谢谢!
【问题讨论】:
【参考方案1】:当您查看 FBLoginView 源代码时,您会发现 FBLoginView 是 UIView 的子类,其中 UIButton 添加为子视图。该按钮没有定义的公共属性,因此无法以正常方式访问。
这样做的方法是迭代子视图,如下所示:https://***.com/a/12281054/317928。但这是一种不好的做法,因为视图层次结构将来可能会发生变化。
另请参阅Facebook login tutorial,使用 API 调用登录部分。本节介绍如何使用简单按钮进行身份验证。
【讨论】:
是的,找到嵌入的按钮并向其发送点击事件确实有效。【参考方案2】:这是适合我的代码 sn-p。
for (id obj in loginView.subviews)
if ([obj isKindOfClass:[UIButton class]])
UIButton * loginButton = obj;
[loginButton sendActionsForControlEvents:UIControlEventTouchUpInside];
break;
它将以编程方式触发 Facebook 登录,也可用于触发注销。然而,注销有一个丑陋的效果。这个pop会显示
在屏幕底部。我希望也有办法隐藏它。
【讨论】:
【参考方案3】:在我看来,以编程方式触发 Facebook 登录的更优雅的方式是管理会话,例如:
-(void)loginLogout
if (FBSession.activeSession.state == FBSessionStateOpen
|| FBSession.activeSession.state == FBSessionStateOpenTokenExtended)
// Close the session and remove the access token from the cache
// The session state handler (in the app delegate) will be called automatically
[FBSession.activeSession closeAndClearTokenInformation];
else
// Initialize a session object
FBSession *session = [[FBSession alloc] initWithPermissions:@[@"publish_actions", @"user_photos"]];
// Set the active session
[FBSession setActiveSession:session];
// Open the session
[session openWithBehavior:FBSessionLoginBehaviorForcingWebView
completionHandler:^(FBSession *session,
FBSessionState status,
NSError *error)
if(error == nil)
NSLog(@"login successful");
// Respond to session state changes,
// ex: updating the view
else
NSLog(@"login unsuccessful");
];
此外,更改会话状态将被隐藏的 LoginView 及其委托方法(如
loginViewShowingLoggedInUser:(FBLoginView *)loginView
将被触发(没有前面提到的丑陋弹出)。
【讨论】:
我成功收到“登录成功”消息,但没有触发 loginViewShowingLoggedInUser 委托方法。【参考方案4】:FBLoginView 有两个子视图,您可以使用视图的子视图签入按钮所在的位置,然后您可以使用以下代码激活操作:
[loginView.subviews[0] sendActionsForControlEvents:UIControlEventTouchUpInside];
【讨论】:
【参考方案5】:我可以使用以下代码触发 facebook:
for (id subview in self.facebookLoginView.subviews)
if ([subview isKindOfClass:[UIButton class]])
UIButton *loginButton = subview;
[loginButton sendActionsForControlEvents:UIControlEventTouchUpInside];
break;
对于 google plus(如果 smbdy 有兴趣):
[self.googleLoginView sendActionsForControlEvents:UIControlEventTouchUpInside];
请注意:如果 SDK 发生更改,您可能必须重新测试并修改它!
【讨论】:
以上是关于如何以编程方式在 iOS 中单击 facebook loginView?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Facebook iOS SDK 3.14.1 以编程方式创建 Facebook 测试用户
Facebook iOS SDK - 不使用 LoginButton 登录(以编程方式)