Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 以编程方式从显示导航堆栈中显示和取消模态viewController_Swift_Uinavigationcontroller_Segue_Modalviewcontroller_Uipresentingcontroller - Fatal编程技术网

Swift 以编程方式从显示导航堆栈中显示和取消模态viewController

Swift 以编程方式从显示导航堆栈中显示和取消模态viewController,swift,uinavigationcontroller,segue,modalviewcontroller,uipresentingcontroller,Swift,Uinavigationcontroller,Segue,Modalviewcontroller,Uipresentingcontroller,我使用UINavigationController作为rootViewController,并且存在一些导航层次结构问题。我从show segue状态以模态方式呈现viewController,但当我取消模态时,它会将应用程序返回到ViewDidAspect navigationController状态,即应用程序启动状态。我认为这是因为,即使我从show navigation堆栈中的第二个视图调用presentViewController函数,该模式仍由父rootViewController处

我使用UINavigationController作为rootViewController,并且存在一些导航层次结构问题。我从show segue状态以模态方式呈现viewController,但当我取消模态时,它会将应用程序返回到ViewDidAspect navigationController状态,即应用程序启动状态。我认为这是因为,即使我从show navigation堆栈中的第二个视图调用presentViewController函数,该模式仍由父rootViewController处理,因此当该模式被解除时,它将返回UINavigationController的viewDidAppear状态。我希望该模式被取消,并返回显示该模式的viewcontroller(show segue堆栈中的第二个屏幕)。提前谢谢你的帮助

//根视图控制器

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
    })

  }

}
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.purple
        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.layer.masksToBounds = true
        return tv
    }()


    var segmentedController: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        activeViewController = firstViewController

//        checkIfUserIsLoggedIn()

        view.addSubview(contentView)

        setupProfileScreen()

        //        navigationItem.title = "Home"
        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)    
    }


    // 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
        }
    }
//家庭控制器

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
    })

  }

}
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.purple
        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.layer.masksToBounds = true
        return tv
    }()


    var segmentedController: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()

        activeViewController = firstViewController

//        checkIfUserIsLoggedIn()

        view.addSubview(contentView)

        setupProfileScreen()

        //        navigationItem.title = "Home"
        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)    
    }


    // 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
        }
    }
//点击按钮以显示viewController的tableviewcontroller-此tableviewcontroller是show导航堆栈中的第二个

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "+ place", style: .plain, target: self, action: #selector(handleSearchPlaces))

    } 

    func handleSearchPlaces() {
        let _: UIViewController! = self.presentingViewController as? PlacesTableVC
        let vc = SearchPlacesController()
        let navController = UINavigationController(rootViewController: vc)
        present(navController, animated: true, completion: nil)
    }
//要解除模式viewController并将用户返回到tableview*非rootViewController应用程序加载状态

class SearchPlacesController: UITableViewController { 
    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "back", style: .plain, target: self, action: #selector(returnToPlacesTableVC))

    }

    func returnToPlacesTableVC(sender: AnyObject) {
        // save the presenting ViewController
        let presentingViewController: UIViewController! = self.presentingViewController as? PlacesTableVC

        self.dismiss(animated: true) {
        // I want to go back to PlacesTableVC - NOT RootViewController with selectedIndex 0
        presentingViewController?.dismiss(animated: true, completion: nil)

        }
    }
}