2017-10-27 2 views
1

내 앱에 사용자가 이미 Facebook에 로그인했는지 확인하는 스플래시 화면이 있습니다. 그렇지 않은 경우 스플래시 화면이 로그인 화면을 탐색 스택으로 푸시합니다. 사용자가 로그인하면 스플래시 화면도 로그인 화면을 푸시하지만 로그인 화면의 viewDidAppear에서 기본 앱 화면을 푸시하는 메소드를 호출합니다. 이 흐름은 그러나 아이폰 OS 9 및 iOS (10)에 문제없이performSegue가 Xcode 9 (및 iOS 11) 업데이트 이후 작동하지 않습니다.

근무

SplashViewController > LoginViewController > MainViewController.

: 사용자가 I 로그인 할 때

그래서, 컨트롤러는 내 응용 프로그램 스택에 다음 뷰를 볼 수 내가 iOS 11로 업그레이드 한 이후로이 흐름이 멈췄습니다.

사용자가 로그인 한 상태에서 기본보기 컨트롤러가 나타나지 않으면 로그인보기 컨트롤러 만 계속 표시됩니다. 디버거에서 주 앱 화면에 performSegue가 실제로 호출되었는지 확인했습니다.

두 가지 이상한 세부 사항이 있습니다. 첫 번째는이 로그인보기 컨트롤러의 버튼이 더 이상 작동하지 않는다는 것입니다 (FacebookLogin SDK에서 Facebook 로그인 흐름을 호출하는 버튼이 있음).

두 번째는 Xcode에서 "디버그 뷰 계층 구조"버튼을 클릭하면 Xcode가 처리되고 뷰 계층을 생성하는 동안 주 뷰 컨트롤러가 갑자기 응용 프로그램에 나타납니다.

메인보기 컨트롤러가 밀려 있지만보기가 표시되지 않는 것 같습니다. LoginViewController의 segues가 더 이상 작동하지 않습니다. 그러나 "Debug View Hierarchy"를 누르면 뷰 계층 구조를 업데이트하는 것으로 간주됩니다.

Xcode 9.0.1을 사용하고 있습니다. 이 문제는 Xcode 시뮬레이터와 현재 iOS 11.0.3을 실행중인 iPad Mini 2에서 발생합니다.

감사합니다.

+0

저도 같은 문제를 가지고있는 것 같습니다,하지만 난 KYDrawerController을 사용하고 있습니다. KYDrawerController를 제거하면 메뉴가 없어져서 잘 동작합니다. – jackofallcode

답변

1

왜 이런 일이 발생했는지 정확히 알 수는 없지만이 문제를 다음과 같은 방법으로 해결할 수있었습니다.

// SplashViewController 
struct Identifier { 
    static let login = "Login" 
    static let direct = "Direct" 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    login() 
} 

func login() { 
    // If there already exists a Facebook token we try to login directly. 
    if let accessToken = AccessToken.current { 
     bm.login(facebookToken: accessToken.authenticationToken, completion: { (error, user) in 
      guard error == nil else { 
       self.performSegue(withIdentifier: Identifier.login, sender: self) 
       return 
      } 
      // This call on the main queue wasn't needed on iOS 10 
      DispatchQueue.main.async { 
       self.performSegue(withIdentifier: Identifier.direct, sender: self) 
      } 
     }) 
    } else { 
     performSegue(withIdentifier: Identifier.login, sender: self) 
    } 
} 
다음 viewWillAppear() 메소드에 대한 다른 SEGUE 부를 것이다 I가 로그인 뷰 컨트롤러에 직접 SEGUE라는 SplashViewController,에

, I 메인 큐에 수행 될 SEGUE 강제 LoginViewController에 다음

는 :

// LoginViewController 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if direct { 
     // Without calling the previous segue on the main queue this 
     // segue would be called but the pushed view controller's 
     // view would not appear on the screen until a refresh event 
     // was triggered. 
     self.performSegue(withIdentifier: Identifier.direct, sender: nil) 
    } 
} 
+0

감사합니다 펠리페, 내 목숨을 구해 줬어!,이 문제에 관한 문서를 찾지 못했지만이 문제는 정확히 11 번에 있었어. – PedroHidalgo

관련 문제