试图只允许在单个特定行上进行滑动行为

Posted

技术标签:

【中文标题】试图只允许在单个特定行上进行滑动行为【英文标题】:Trying to only allow swipe behavior on a single specific row 【发布时间】:2016-08-21 19:28:43 【问题描述】:

我正在使用最新的 Swift 3 Beta(Xcode 版本 8.0 beta 6 (8S201h))。

我读到您需要最后三个函数来实现滑动行为,并且可以正常工作,因为我可以在所有行上滑动。

我的表格的基本行为是显示一到八行 (numberOfRowsInSection) 的显示结果。用户可以点击任何行,一个“扩展”/详细信息行将插入 (didSelectRowAt) 录制的单元格下方。

当用户滑动“扩展”行时,会显示两个按钮 (editActionsForRowAtIndexPath)。

问题

用户仍然可以滑动任何其他行,这是我试图用 (canEditRowAt indexPath) 中的逻辑来消除的。

我已经测试了返回 false 和 true 并且该操作仍然有效。我还包括了打印行,以查看是否正在调用 func 并且它从未出现在日志中。

想法?

import UIKit

class vcAwards: UIViewController, UITableViewDelegate 

... lots of other working code ...

/************************/
/** List Award Winners **/
/************************/
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return award.count


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    // TBD add isExpanded to Award Class????
    let tappedRow = indexPath.row
    let nextRow   = indexPath.row + 1

    if expandedRowIs == -1 
        award.insert("Expanded", at: nextRow)
        expandedRowIs = tappedRow
     else if tappedRow == expandedRowIs || tappedRow == expandedRowIs + 1 
        award.remove(at: expandedRowIs + 1)
        expandedRowIs = -1
     else 
        award.remove(at: expandedRowIs + 1)
        if tappedRow > expandedRowIs 
            award.insert("Expanded", at: tappedRow)
            expandedRowIs = tappedRow - 1
         else 
            award.insert("Expanded", at: nextRow)
            expandedRowIs = tappedRow
        
    
    tableView.reloadData()


func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath) -> UITableViewCell  ... 

///
/// Next three functions provide for the Swipe left functionality
///
func tableView(_ tableView: UITableView, editActionsForRowAtIndexPath indexPath: IndexPath) -> [AnyObject]? 
    if award[indexPath.row] != "Expanded" 
        return nil
     else 
        let myDog = UITableViewRowAction(style: .normal, title: "My Dog")  action, index in
            print("'My Dog' swipped and clicked")
        
        myDog.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share")  action, index in
            print("'Share' swipped and clicked")
        
        share.backgroundColor = UIColor.blue

        return [share, myDog]
    


func tableView(_ tableView: UITableView, canEditRowAtIndexPath indexPath: IndexPath) -> Bool 

    // ---> This print never shows up in the log
    print ("*** Want to only swipe on Expanded rows: \(award[indexPath.row])")

    // ---> What I want to use as the final logic
    //  return award[indexPath.row] == "Expanded"

    // ---> Using either of the following allow the swipes to happen
    //return true
    return false


func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 



【问题讨论】:

award[indexPath.row] == "Expanded" 有什么问题? 这应该是 return award[canEditRowAtindexPath.row] == "Expanded",但它并没有解决问题。 【参考方案1】:

对于您不想应用操作的行,只需在 editActionsForRowAtIndexPath 中返回 nil 和在 canEditRowAtIndexPath 中返回 false

【讨论】:

这几乎可以工作,现在我没有自定义按钮,只有非扩展行的“删除”按钮。在 canEditRowAtindexPath 中,返回 true 和返回 false 都允许滑动。 不,您需要在editActionsForRowAtIndexPath canEditRowAtIndexPath 中应用相同的过滤器 我不明白。 (我更新了原始代码以在 editActionsForRowAtIndexPath 中包含 if / else)。我需要在 canEditRowAtIndexPath 中包含什么?我尝试过的所有东西都不起作用(真、假和行 == 扩展行)。 我发现了问题,函数中的一个错字。 func tableView(_ tableView: UITableView, canEditRowAtIndexPath indexPath: IndexPath) -> Bool 我有 func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 。我已经更新了代码。谢谢!【参考方案2】:

我在原始代码中有两个问题。对于我不希望对其进行自定义操作并且我没有正确的选项名称的单元格,我没有返回 nil。

在初始代码示例中更正:

func tableView(_ tableView: UITableView, canEditRowAtIndexPath indexPath: IndexPath) -> Bool 

不正确:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 

【讨论】:

以上是关于试图只允许在单个特定行上进行滑动行为的主要内容,如果未能解决你的问题,请参考以下文章

如何在部分中为特定行滑动 tableviewcell

95行代码极验滑动验证码?是远远不够的!大牛石锤!

在 KDB/Q 中按时滑动窗口

如何在列表与单个元素上进行模式匹配

Android 自定义可以滑动和点击的RangeBar

Android 自定义可以滑动和点击的RangeBar