如何以编程方式在 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 测试用户

以编程方式从 iOS 中的 facebook SDK 注销

Facebook iOS SDK - 不使用 LoginButton 登录(以编程方式)

通过 Facebook iOS Sdk iphone 以编程方式对新闻提要进行喜欢/评论

iOS 以编程方式转到选项卡和推送视图控制器

Facebook SDK 4.0 IOS Swift 以编程方式注销用户