ios - 如何在 Swift iOS 中关闭上一个 View Controller 并移至下一个 View Controller

标签 ios swift xcode uitableview uiviewcontroller

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

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

现在的问题是,之前出现的 View Controller (在我通过 tableView 菜单移动到新 Controller 之前)不会被忽略。因此,在应用程序中,我可以多次呈现“在线订购” View Controller ,这显然会导致内存问题,

但是我不希望 View Controller 在呈现 tableView 时被关闭,因为我正在使用自定义转换,其中 tableview 在屏幕上向下滑动一半,因此前一个 Controller 的快照应该仍然存在,只有当在 tableView 中单击一个单元格,如果在关闭 tableView 之前加载 View Controller ,则会显示一个新的 View Controller 。

这是 Storyboard的屏幕截图:

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)

有很多方法,但它只是无法使应用程序按照我想要的方式工作,任何帮助将不胜感激。

最佳答案

在 didSelectRowAt 方法中,每次要呈现新 Controller 时,都会实例化 View Controller 的新实例。

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

关于ios - 如何在 Swift iOS 中关闭上一个 View Controller 并移至下一个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41234351/

相关文章:

ios - UILabel 自动换行

ios - 创建滑动以显示 iOS 7 的按钮,使用清晰的背景色

ios - didSelect 自定义 POI 仅在 map 放大时触发

ios - 如何在中心点旋转 CAShapeLayer

ios - Swift 中的 Firebase。无法将类型 'NSNull' 的值转换为 'NSDictionary'

arrays - 如何根据条件存储数组值?

ios - 使用 GPUImage 捕捉时减少不必要的运动模糊

ios - 按下横幅时 iAd 不起作用?

ios - 导航项中不支持 Swift 纯样式

objective-c - 如何查看 Swift 函数的 Objective-C 名称