在我的应用程序中,我使用UITableView作为我的应用程序的导航菜单,它有5个单元格,“主页”,“在线订购”,“图库”,“联系人”,“关于”。
它是如何工作的,当用户点击菜单按钮时,UITableView菜单会弹出,然后当单击一个单元格时,会加载正确的UIViewController。
现在,问题是,呈现的前一个视图控制器(在通过tableView菜单移动到新控制器之前)不会被解除。所以在应用程序中,我可以多次呈现“在线订购”视图控制器,这显然会导致内存问题,
但我不希望视图控制器在显示tableView时被解除,因为我正在使用自定义转换,其中tableview在屏幕的一半向下滑动,因此前一个控制器的快照应该仍然存在,仅当如果在取消tableView之前加载视图控制器,则会在tableView中单击一个单元格并显示一个新的视图控制器。
这是故事板的截图:
这里有一些截图:
这是我的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)
以多种方式,但它不会使应用程序以我想要的方式工作,任何帮助都将受到赞赏。
答案 0 :(得分:2)
在didSelectRowAt方法中,每次要呈现新控制器时,都要实例化视图控制器的新实例。
您可以在menuTableViewController中预先实例化它们(可能在viewDidLoad中),然后重用控制器的相同实例。这样做还可以让你能够从menuTableViewController类中解除它们,因为它保存了对每个新控制器的引用。
答案 1 :(得分:1)
如果你正在创建一个,我建议使用一个自定义导航控制器进行向下菜单+按钮,它将控制内容菜单和vc,如果你想改变它的root vc,只需设置该自定义的vc导航控制器self.setViewControllers([vc], animated: true)
,其他vc将自动解除