如何解除以前的视图控制器并转移到Swift iOS

时间:2016-12-20 03:19:37

标签: ios swift xcode uitableview uiviewcontroller

在我的应用程序中,我使用UITableView作为我的应用程序的导航菜单,它有5个单元格,“主页”,“在线订购”,“图库”,“联系人”,“关于”。

它是如何工作的,当用户点击菜单按钮时,UITableView菜单会弹出,然后当单击一个单元格时,会加载正确的UIViewController。

现在,问题是,呈现的前一个视图控制器(在通过tableView菜单移动到新控制器之前)不会被解除。所以在应用程序中,我可以多次呈现“在线订购”视图控制器,这显然会导致内存问题,

但我不希望视图控制器在显示tableView时被解除,因为我正在使用自定义转换,其中tableview在屏幕的一半向下滑动,因此前一个控制器的快照应该仍然存在,仅当如果在取消tableView之前加载视图控制器,则会在tableView中单击一个单元格并显示一个新的视图控制器。

这是故事板的截图:

enter image description here

这里有一些截图:

enter image description here

这是我的TableViewController中用作导航菜单的所有“相关”代码:

class MenuTableViewController: UITableViewController {

var menuItems = ["Home", "Order Online", "Gallery", "Contact Us", "About"]
var currentItem = "Home"


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MenuTableViewCell

    // Configure the cell...
    cell.titleLabel.text = menuItems[indexPath.row]
    cell.titleLabel.textColor = (menuItems[indexPath.row] == currentItem) ? UIColor.white : UIColor.gray

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if (indexPath.row == 0) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "homeView")
        self.present(controller, animated: true, completion: nil)

    }

    if (indexPath.row == 1) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "orderView")
        self.present(controller, animated: true, completion: nil)


    }

    if (indexPath.row == 2) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "galleryView")
        self.present(controller, animated: true, completion: nil)

    }

    if (indexPath.row == 3) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "contactView")
        self.present(controller, animated: true, completion: nil)

    }

    if (indexPath.row == 4) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "aboutView")
        self.present(controller, animated: true, completion: nil)

    }

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
      let menuTableViewController = segue.source as! MenuTableViewController

      if menuTableViewController.tableView.indexPathForSelectedRow != nil {


      }
  }

}

我尝试过使用

self.dismiss(animated: true, completion: nil)

以多种方式,但它不会使应用程序以我想要的方式工作,任何帮助都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

在didSelectRowAt方法中,每次要呈现新控制器时,都要实例化视图控制器的新实例。

您可以在menuTableViewController中预先实例化它们(可能在viewDidLoad中),然后重用控制器的相同实例。这样做还可以让你能够从menuTableViewController类中解除它们,因为它保存了对每个新控制器的引用。

答案 1 :(得分:1)

如果你正在创建一个,我建议使用一个自定义导航控制器进行向下菜单+按钮,它将控制内容菜单和vc,如果你想改变它的root vc,只需设置该自定义的vc导航控制器self.setViewControllers([vc], animated: true),其他vc将自动解除