在表视图中使用segues和动态单元格的邮件应用程序中导航?

时间:2016-04-25 08:06:47

标签: ios iphone xcode swift

我正在为大学开发我的第一个iOS应用程序。当您启动应用程序时,有一个分组表视图应该代表一个菜单。这到目前为止工作正常,但我无法正确连接segues。据我所知,我应该将单元本身与导航控制器连接起来。虽然每个单元格都应该导致另一个导航控制器这是一个菜单,所以这一点应该清楚。不幸的是,我无法将单个单元连接到多个导航控制器,当我添加多个原型单元时,我遇到的问题是每个单元都应该有自己的标识符。

您在我的应用中看到的第一个屏幕看起来基本上就像邮件应用。有两组,每个单元通向另一个导航控制器。

我设法以某种奇怪的方式实现导航,但是获得了很多错误,例如“嵌套推送导致损坏的导航栏”。

我现在非常沮丧,我已经花了很多时间处理这个问题而且我找不到任何解决方案。

编辑: 目前最大的问题之一是,如果我导航到一个点然后返回视图之前,分组视图首先显示得太靠近顶部,当动画完成时,整个视图会跳回到它所属的位置。

它应该是这样的(看起来像它跳回来的时候):https://dl.dropboxusercontent.com/u/34140308/uploads/2016-04-25%2010.28.48.png

这就是动画期间的样子:https://dl.dropboxusercontent.com/u/34140308/uploads/2016-04-25%2010.28.48%202.png

edit2:我将视图控制器本身(不是单元格)与相应的视图控制器连接起来。然后我以编程方式调用segues:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    if indexPath.section == 0 {
        if indexPath.row == 0 {
            self.performSegueWithIdentifier("showSpeiseplan", sender: self)
        } else if indexPath.row == 1 {
            self.performSegueWithIdentifier("showStudiersaal", sender: self)
        } else if indexPath.row == 2 {
            self.performSegueWithIdentifier("showErzieher", sender: self)
        } else if indexPath.row == 3 {
            self.performSegueWithIdentifier("showHausordnung", sender: self)
        } else if indexPath.row == 4 {
            self.performSegueWithIdentifier("showNews", sender: self)
        }
    } else if indexPath.section == 1 {
        if indexPath.row == 0 {
            self.performSegueWithIdentifier("showZugewieseneStunden", sender: self)
        }
    }
}

现在另一个主要问题是,如果您在加载单个单元格之前多次按下单个单元格,那么该视图也会多次打开。

1 个答案:

答案 0 :(得分:1)

我通常从tableView中进行segue的方法是通过连接viewController而不是tableviewCells的segue。这样你就可以在didSelectRowAtIndexPath中调用performSegueWithIdentifier。

例如

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    tableView.userInteractionEnabled = false

    switch indexPath.section {
    case 0:
        switch indexPath.row {
        case 0: performSegueWithIdentifier("showSpeiseplan", sender: self)
        case 1: performSegueWithIdentifier("showStudiersaal", sender self)
        case 2: performSegueWithIdentifier("showErzieher", sender self)
        case 3: performSegueWithIdentifier("showHausordnung", sender self)
        case 4: performSegueWithIdentifier("showNews", sender self)
        default: tableView.userInteractionEnabled = true
        }
    case 1:
        switch indexPath.row {
        case 0: performSegueWithIdentifier("showZugewieseneStunden", sender: self)
        default: tableView.userInteractionEnabled = true
        }
    default: tableView.userInteractionEnabled = true
    }
}

并在viewWillDisappear中显示:

 override func viewDidDisappear(animated: Bool) {
    tableView.userInteractionEnabled = true
 }

如果你的单元格是可编辑的或动态的(它们改变了indexPath),那么要么使用cellForRowAtIndexPath中的cell.tag来区分它们,要么为你的自定义单元格类添加一个属性(或者如果你还没有,则添加一个属性)并添加可用于识别正确segue的属性。

编辑:要修复动态上的tableView Offset跳转,请在viewDidLoad上方创建一个变量tableViewContentOffset,然后在viewDidLoad中添加:

 tableViewContentOffset = tableView.contentOffset

并在viewWillAppear中恢复它,如果它已更改。

if tableView.contentOffset != tableViewContentOffset {
    tableView.contentOffset = tableViewContentOffset
}

另外,也许只是看看当你把它放在viewWillAppear中时会发生什么:

tableView.contentOffset = CGPointZero
tableView.contentInset = UIEdgeInsetsZero