在我的应用程序中,我使用 UITableView 作为我的应用程序的导航菜单,它有 5 个单元格,“主页”、“在线订购”、“图库”、“联系方式”、“关于”。
它的工作原理是,当用户单击菜单按钮时,UITableView 菜单会弹出,然后当单击单元格时,会加载正确的 UIViewController。
现在的问题是,之前出现的 View Controller (在我通过 tableView 菜单移动到新 Controller 之前)不会被忽略。因此,在应用程序中,我可以多次呈现“在线订购” View Controller ,这显然会导致内存问题,
但是我不希望 View Controller 在呈现 tableView 时被关闭,因为我正在使用自定义转换,其中 tableview 在屏幕上向下滑动一半,因此前一个 Controller 的快照应该仍然存在,只有当在 tableView 中单击一个单元格,如果在关闭 tableView 之前加载 View Controller ,则会显示一个新的 View Controller 。
这是 Storyboard的屏幕截图:
以下是一些屏幕截图:
这里是我的 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)
有很多方法,但它只是无法使应用程序按照我想要的方式工作,任何帮助将不胜感激。
最佳答案
在 didSelectRowAt 方法中,每次要呈现新 Controller 时,都会实例化 View Controller 的新实例。
您可以简单地在 menuTableViewController 中预先实例化它们(可能在 viewDidLoad 中),然后重用 Controller 的相同实例。这样做还可以让您能够从 menuTableViewController 类中消除它们,因为它保存了对每个新 Controller 的引用。
关于ios - 如何在 Swift iOS 中关闭上一个 View Controller 并移至下一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234351/