Facebook登录完成后的UITableView reloadData()

时间:2015-09-16 11:44:31

标签: ios swift uitableview uiviewcontroller

我的应用允许用户通过Facebook登录。按登录按钮可将用户重定向到Safari / Facebook应用程序(FBSDK默认设置)。登录完成后,用户将被重定向回我的应用程序。在活动的Facebook会话期间,用户应该在UITavleView小区中看到来自Facebook的个人资料图片和用户名。问题是重定向后单元格没有更新,我需要在登录过程后手动调用tableView.reloadData(),以便表格正确显示。

我已尝试覆盖ViewController's viewDidAppear()方法,但应用之间的转换不会调用此方法。我还尝试了一个每x秒重新加载表数据的计时器,但这不是我的问题的真正解决方案。我还想过使用一些app delegate的方法,但这似乎也是一种不好的做法。有人知道吗?我试图在FBSDK文档中查找类似于UIWebView's didFinishLoading()的方法,但没有找到任何有价值的方法。

3 个答案:

答案 0 :(得分:1)

信任用户离开您的应用程序并登录到FB然后返回,您可以利用AppDelegate方法- (void)applicationWillEnterForeground:(UIApplication *)iApplication触发本地通知并在View Controller中侦听它以触发表重新加载。

修改

您可以在视图控制器“UIApplicationWillEnterForegroundNotification方法中直接注册loadView。但请确保在视图卸载或取消分配时删除观察者。

NSNotificationCenter.defaultCenter().addObserver(
    self,
    selector: “applicationBecameActive:",
    name: UIApplicationWillEnterForegroundNotification,
    object: nil)

@objc func applicationBecameActive(notification: NSNotification){     
    //reload your table here
}

答案 1 :(得分:1)

您可以使用Facebook登录代表方法。如果登录成功,则重新加载tableview数据

- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
if (error) {
    NSLog(@"Unexpected login error: %@", error);
    NSString *alertMessage = error.userInfo[FBSDKErrorLocalizedDescriptionKey] ?: @"There was a problem logging in. Please try again later.";
    NSString *alertTitle = error.userInfo[FBSDKErrorLocalizedTitleKey] ?: @"Oops";
    [[[UIAlertView alloc] initWithTitle:alertTitle
                                message:alertMessage
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];
} else {
     NSLog(@"Success login and Reload Tableview data");
}
}

不要忘记设置你的Facebook按钮代理

self.loginBut.delegate=self;

答案 2 :(得分:0)

在AppDelegate中

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    if ([FBSDKAccessToken currentAccessToken]) {
        //Post notification to reload after came from login
    }
    else {
        // Try to login first
    }

    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation
            ];
}