0

로딩 중 자식 ViewController를로드하는 데 어려움을 겪고 있습니다. 내가 처음 로그인하면 childViewController가로드되지 않고 containerView가 표시됩니다. 앱을 닫고 로그인 상태로 앱을 다시 열면 containerView에 childView가 표시됩니다. 내 창 계층 및 rootviewController와 관련이 있다는 것을 알고 있습니다. 나는이 무리를 연구했지만 여전히 문제를 해결하고있다. 미리 감사드립니다!childViewControllers 처음으로 로딩

// 애플 대리자 @UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     window = UIWindow(frame: UIScreen.main.bounds) 
     window?.makeKeyAndVisible() 
     window?.rootViewController = MainNavigationController() 

     return true 
    } 

// mainNavigationController - RootViewController

class MainNavigationController: UINavigationController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let vc1 = TravelersFeedVC() 
     let vc2 = ProfileVC() 

     if isLoggedIn() { 
      // assume user is logged in 
      let homeController = HomeController() 
      homeController.firstViewController = vc1 
      homeController.secondViewController = vc2 

      viewControllers = [homeController] 

     } else { 
      perform(#selector(showLoginController), with: nil, afterDelay: 0.01) 
     } 

    } 

    fileprivate func isLoggedIn() -> Bool { 
     return UserDefaults.standard.isLoggedIn() 
    } 

    func showLoginController() { 
     let loginController = LoginController() 
     present(loginController, animated: true, completion: { 
      // perhaps do something here later 
     }) 
    } 
} 

// 기능 로그인

func finishLoggingIn() { 
     let rootViewController = UIApplication.shared.keyWindow?.rootViewController 
     guard let mainNavigationController = rootViewController as? MainNavigationController else { return } 
     mainNavigationController.viewControllers = [HomeController()] 

     let vc1 = TravelersFeedVC() 
     let vc2 = ProfileVC() 

     let homeController = HomeController() 
     homeController.firstViewController = vc1 
     homeController.secondViewController = vc2 

     UserDefaults.standard.setIsLoggedIn(value: true) 
     dismiss(animated: true, completion: nil) 
    } 

// HomeController

class HomeController: UIViewController, FBSDKLoginButtonDelegate { 

    // child view controllers to put inside content view 
    var firstViewController: TravelersFeedVC? 
    var secondViewController: ProfileVC? 

    private var activeViewController: UIViewController? { 
     didSet { 
      removeInactiveViewController(inactiveViewController: oldValue) 
      updateActiveViewController() 
     } 
    } 

    private func removeInactiveViewController(inactiveViewController: UIViewController?) { 
     if let inActiveVC = inactiveViewController { 
      // call before removing child view controller's view from hierarchy 
      inActiveVC.willMove(toParentViewController: nil) 

      inActiveVC.view.removeFromSuperview() 

      // call after removing child view controller's view from hierarchy 
      inActiveVC.removeFromParentViewController() 
     } 
    } 

    private func updateActiveViewController() { 
     if let activeVC = activeViewController { 
      // call before adding child view controller's view as subview 
      addChildViewController(activeVC) 

      activeVC.view.frame = contentView.bounds 
      contentView.addSubview(activeVC.view) 

      // call before adding child view controller's view as subview 
      activeVC.didMove(toParentViewController: self) 
     } 
    } 

    // UI elements 
    lazy var contentView: UIView = { 
     let tv = UIView() 
     tv.backgroundColor = UIColor.blue 
     tv.translatesAutoresizingMaskIntoConstraints = false 
     tv.layer.masksToBounds = true 
     return tv 
    }() 

    var segmentedController: UISegmentedControl! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     activeViewController = firstViewController 

     checkIfUserIsLoggedIn() 
     view.addSubview(contentView)  
     setupProfileScreen() 

     let items = ["Travelers", "Me"] 
     segmentedController = UISegmentedControl(items: items) 
     navigationItem.titleView = segmentedController 

     segmentedController.tintColor = UIColor.black 
     segmentedController.selectedSegmentIndex = 0 

     // Add function to handle Value Changed events 
     segmentedController.addTarget(self, action: #selector(HomeController.segmentedValueChanged(_:)), for: .valueChanged) 

     navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Sign Out", style: .plain, target: self, action: #selector(handleSignOut)) 
     navigationItem.leftBarButtonItem?.tintColor = UIColor.black 

    } 

    // reference to collectionViewController 
    var travelersFeedVC: TravelersFeedVC! 

    func segmentedValueChanged(_ sender:UISegmentedControl!) 
    { 
     switch segmentedController.selectedSegmentIndex { 
     case 0: 
      activeViewController = firstViewController 

     case 1: 
      activeViewController = secondViewController 

     default: // Do nothing 
      break 
     } 
    } 

답변

0

finishLoggingIn()에는 두 개의 개별 HomeController 인스턴스가 사용 된 것 같습니다.

이와 비슷한 것으로 수정해야합니다.

func finishLoggingIn() { 
    let rootViewController = UIApplication.shared.keyWindow?.rootViewController 
    guard let mainNavigationController = rootViewController as? MainNavigationController else { return } 

    // create it 
    let homeController = HomeController() 
    // use it 
    mainNavigationController.viewControllers = [homeController] 

    let vc1 = TravelersFeedVC() 
    let vc2 = ProfileVC() 

    // use it again 
    homeController.firstViewController = vc1 
    homeController.secondViewController = vc2 

    UserDefaults.standard.setIsLoggedIn(value: true) 
    dismiss(animated: true, completion: nil) 
} 
+0

고맙습니다 ... 지금 당장 고생하고 있습니다! – user3708224