尝试仅允许在单个特定行上滑动行为

时间:2016-08-21 19:28:44

标签: ios swift uitableview swipe

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

我已经读过您需要最后三个功能来实现滑动行为,并且正常工作,因为我可以在所有行上滑动。

我的表的基本行为是我在显示结果的一到八行(numberOfRowsInSection)之间显示。用户可以点按任意一行,并且会在录制的单元格下方插入一个“扩展的' /详细信息”行(didSelectRowAt)。

当用户滑动'扩展'在行中,有两个显示的按钮(editActionsForRowAtIndexPath)。

ISSUE

用户仍然可以刷任何其他行,这是我试图用(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) {
}
}
}

2 个答案:

答案 0 :(得分:0)

只需返回nil中的editActionsForRowAtIndexPathfalse中的canEditRowAtIndexPath,即可获取您不想应用操作的行。

答案 1 :(得分:0)

原始代码中有两个问题。我没有为我不想要自定义操作的单元格返回nil,而且我没有正确的选项名称。

在初始代码示例中进行了更正:

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

不正确:

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