滑动单元格时,有没有办法从 tableViewCell 导航到另一个视图控制器?

Posted

技术标签:

【中文标题】滑动单元格时,有没有办法从 tableViewCell 导航到另一个视图控制器?【英文标题】:Is there a way to navigate from a tableViewCell to another view controller when a cell is swiped? 【发布时间】:2015-05-21 07:26:27 【问题描述】:

这就是我制作滑动单元格的方法:Custom Table View Cell Not Swiping。无论如何,我想知道当单元格向左滑动时是否有一种从表格视图转换到另一个视图控制器的方法。我知道它可以在点击单元格并在 didSelectRowAtIndexPath 中调用 performSegueWithIdentifier 时完成,但从未见过滑动单元格的示例。我尝试将self.performSegueWithIdentifier("detail", sender: self) 添加到滑动的逻辑中

if recognizer.state == .Ended 
            // the frame this cell had before user dragged it
            let originalFrame = CGRect(x: 0, y: frame.origin.y,
                width: bounds.size.width, height: bounds.size.height)
            if !reserveOnDragRelease 
                // if the item is not being deleted, snap back to the original location
                UIView.animateWithDuration(0.2, animations: self.frame = originalFrame)
             else 
                UIView.animateWithDuration(0.2, animations: self.frame = CGRectMake(-self.bounds.size.width, originalFrame.origin.y, originalFrame.width, originalFrame.height))
            // Added it here 

            
        

但收到 CustomTableViewCell 没有名为 performSegueWithIdentifier 的成员的错误。任何人有任何见解? 谢谢!

【问题讨论】:

【参考方案1】:

首先,performSegueWithIdentifier 是一个UIViewController 方法,所以UIView 对象将永远无法接收它。

其次,我不建议你在刷屏的时候切换 View Controller,因为这有点违反 ios 人机界面的原则。人们习惯于通过滑动来删除或编辑它,而不是导航到下一个视图控制器。

但是,如果您真的确定要这样做,只需获取您当前的 UIViewController 对象就可以了。但是我认为在视图中获取视图控制器对象并不是一个好的设计。您可能想看看 UITableViewDelegate 协议以找到更好的地方。此外,您可以利用滑动手势的委托来执行您的操作。

你不必一定要坚持使用performSegueWithIdentifier,有很多方法可以切换视图控制器。

【讨论】:

我正在将单元格制作成一个 Tweetbot,在其中滑动单元格会详细打开它并点击它会展开。为什么在视图中获取视图控制器对象不是一个好主意?究竟会发生什么? 通常一个视图控制器持有一个 UIView 对象,并且您在这个 UIView 对象中添加您的子视图。所以一件事是如果您的自定义视图包含对视图控制器的引用,您可能会小心不要引入retain cycles。通常 View 通过通知或委托与 ViewController 对话,而不是直接调用视图控制器方法。你不被禁止这样做,但这是一个很好的模式,因为许多有经验的人认为这是最好的方法。更灵活,错误更少 此外,我认为你应该考虑人们的习惯——减少让人们犯错的机会。对于一个好的应用程序来说,重要的是要始终考虑人们在使用应用程序时的感受。你认为你的设计很有创意,但人们可能认为它违反了他们习惯于不假思索地做的事情。【参考方案2】:

这是因为theCustomTableViewCell 没有名为performSegueWithIdentifier 的方法,但 UIViewController 有该方法

尝试委托UITableViewDelegate并使用此方法单独获取项目:

    myTableView.delegate = self

    ////////////////////////////

    var myItems: [String: Bool] = [:]

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
        let selectedItem = items.objectAtIndex(indexPath.row) as String
        let itemId = selectedItem.componentsSeparatedByString("$%^")
        // add to self.selectedItems
        myItems[itemId[1]] = true
    

    func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) 
        let selectedItem = items.objectAtIndex(indexPath.row) as String
        let itemId = selectedItem.componentsSeparatedByString("$%^")
        // remove from self.selectedItems
        myItems[itemId[1]] = nil
    

【讨论】:

以上是关于滑动单元格时,有没有办法从 tableViewCell 导航到另一个视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

尝试滑动删除当前单元格时,表格视图单元格开始抖动

UITableView:滑动表格视图单元格时如何停止选择

当我们已经有一个单元格时,尝试设置滑动以删除单元格……这似乎不太好

如何在自定义滑动(而不是滑动删除)单元格(滑动到邮件/短信)中点击一个单元格时删除在其他 TableView 单元格中添加的子视图

iOS 7 UITableView 问题 - 当我们已经有一个单元格时尝试设置滑动以删除单元格

隐藏collectionview单元格时关闭空间?