Swift - 从滑入式菜单中打开UIViewController

时间:2017-05-03 13:55:48

标签: swift uiviewcontroller

当我按导航栏中的菜单按钮时,我有一个滑入式菜单。可以通过点击背景或菜单本身来解决它。在此视图中,我有几个项目,其中一个是用户配置文件按钮。当我按下此按钮时,我希望菜单解除自己,然后立即打开用户配置文件视图控制器。这就是我先调用 handleDismiss()然后设置需要打开的视图的原因

然而,它一直告诉我视图不在窗口层次结构中。我知道问题是什么(查看堆栈),但我不知道怎么能让它正常工作。我应该如何解决这个问题?

RootViewController - > HomeController(tabBar索引0) - >滑入式菜单 - > UserProfileController

打开控制器的按钮

profileCell.profileButton.addTarget(self, action: #selector(handleUserProfile(sender:)), for: .touchUpInside)

功能

func handleDismiss() {
    UIView.animate(withDuration: 0.5) {
        self.blackView.alpha = 0

        if let window = UIApplication.shared.keyWindow {
            self.collectionView.frame = CGRect(x: 0, y: window.frame.height, width: self.collectionView.frame.width, height: self.collectionView.frame.height)
        }
    }
}

func handleUserProfile(sender: UIButton) {
    handleDismiss()

    let userProfileController = UserProfileController()
    openProfileController(userProfileController)
}

func openProfileController(_ controller: UIViewController) {
   present(controller, animated: false, completion: nil)
}

1 个答案:

答案 0 :(得分:0)

我通过在菜单中设置对rootViewController的引用来解决问题。

<强>的HomeController

let menuLauncher = MenuLauncher()

func tappedMenu(sender: UIButton) {
    menuLauncher.showMenu(self)
}

<强> MenuController

func MenuLauncher() {
    self.m_ParentViewController = nil
}

func showMenu(_ parentViewController: UIViewController) {
    self.m_ParentViewController = parentViewController

    collectionView.dataSource = self
    collectionView.delegate = self

    collectionView.register(MenuLauncherImageCell.self, forCellWithReuseIdentifier: cellIdImage)
    collectionView.register(MenuLauncherInfoCell.self, forCellWithReuseIdentifier: cellIdInfo)

    if let window = UIApplication.shared.keyWindow {
        blackView.backgroundColor = UIColor(white: 0, alpha: 0.5)

        blackView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))

        window.addSubview(blackView)
        window.addSubview(collectionView)

        collectionView.frame = CGRect(x: 0, y: window.frame.height, width: window.frame.width, height: 350)

        blackView.frame = window.frame
        blackView.alpha = 0

        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
            self.blackView.alpha = 1
            self.collectionView.frame = CGRect(x: 0, y: window.frame.height - 350, width: self.collectionView.frame.width, height: self.collectionView.frame.height)

        }, completion: nil)
    }
}

func handleDismiss() {
    UIView.animate(withDuration: 0.5) {
        self.blackView.alpha = 0

        if let window = UIApplication.shared.keyWindow {
            self.collectionView.frame = CGRect(x: 0, y: window.frame.height, width: self.collectionView.frame.width, height: self.collectionView.frame.height)
        }
    }
}

func handleUserProfile(sender: UIButton) {
    handleDismiss()

    let userProfileController = UserProfileController()
    self.m_ParentViewController?.present(userProfileController, animated: true, completion: nil)
}