试图只允许在单个特定行上进行滑动行为
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
【讨论】:
以上是关于试图只允许在单个特定行上进行滑动行为的主要内容,如果未能解决你的问题,请参考以下文章