アプリが Facebook ログインから戻った後、モーダル ビューを閉じる際に問題が発生しています。私は Facebook のチュートリアルに従い、アプリのデリゲートを使用したくなかったので、コードを自由に変更しました。私はいくつかのコードスニペットを投稿します
私は2つのクラスを使用しています。1 つのクラスは、ユーザーがログインしていた場合にポップアップする DayViewController という初期ビューと、ユーザーがログインしていない場合にポップアップするモーダル ビューです。
また、私はストーリーボードを使用しており、DayViewController にナビゲーション バーが埋め込まれ、タブ バーに埋め込まれているようにアプリを構築したことにも注意してください。私の問題は、現在表示されているビューを取得するためにいくつかのコードを使用してからそれを却下する Facebook チュートリアルにあると思います...私はそれを実装できませんでした。
DayViewController クラス --
ViewDidLoad
- (void)viewDidLoad
{
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
[self openSession];
}else {
[self showLoginView];
}
[super viewDidLoad];
}
showLoginView
- (void)showLoginView{
UIViewController *topViewController = [self.navigationController topViewController];
UIViewController *modalViewController = [topViewController presentedViewController];
if (![modalViewController isKindOfClass:[LoginViewController class]]) {
LoginViewController *lvc = [self.storyboard instantiateViewControllerWithIdentifier:@"loginView"];
[self presentViewController:lvc animated:NO completion:nil];
} else {
LoginViewController *loginVC = [[LoginViewController alloc] init];
[loginVC loginFailed];
}
}
sessionStateChanged
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
switch (state) {
case FBSessionStateOpen: {
UIViewController *topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"loginView"];
//LoginViewController *lvc = [self.storyboard instantiateViewControllerWithIdentifier:@"loginView"];
if ([[topViewController presentedViewController]
isKindOfClass:[LoginViewController class]]) {
[self dismissViewControllerAnimated:NO completion:nil];
}else{
}
}
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
// Once the user has logged in, we want them to
// be looking at the root view.
//[self.navController popToRootViewControllerAnimated:NO];
[FBSession.activeSession closeAndClearTokenInformation];
[self showLoginView];
break;
default:
break;
}
if (error) {
UIAlertView *alertView = [[UIAlertView alloc]
initWithTitle:@"Error"
message:error.localizedDescription
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
NSLog(@"Error");
[alertView show];
}
}
デフォルトの OpenSession
- (void)openSession{
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler: ^(FBSession *session,FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
LoginViewController クラス---
このクラスには劇的なものはなく、openSession 関数を介して Facebook の状態をスローするサインイン ボタンのみです。
- (IBAction)signInButton:(id)sender {
[self.loginActivityIndicator startAnimating];
dvc = [[DayViewController alloc] init];
[dvc openSession];
//[self dismissViewControllerAnimated:YES completion:Nil];
}