iOS 9中可滑动的表格视图单元格


83

我希望我的表列表具有可滑动菜单,例如iOS 8(iOS 7中首次引入)。

表格视图单元格操作按钮的屏幕截图

我找到了雷·温德利希(Ray Wenderlich)指南,该指南清楚地说明了如何进行操作,但是该指南是在一年零四个月之前编写的,并且代码在Objective-C中。

iOS 8或即将推出的iOS 9最终是否在Apple的SDK中包含了此功能?我知道他们在几年前内置了“滑动显示删除功能”。如果Apple的新iOS将它打包在一个整齐的包装中,我不想浪费时间实施补丁代码来模仿iOS 8邮件功能。



2
有没有人找到在Swift中从左向右滑动的解决方案?从右到左似乎有据可查并得到了很好的讨论,但没有从左到右。
阿提克斯

Answers:


159

试试这个。(已针对Swift 3.0更新)(开发人员文档

override func tableView(_ tableView: UITableView, editActionsForRowAt: IndexPath) -> [UITableViewRowAction]? {
    let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
        print("more button tapped")
    }
    more.backgroundColor = .lightGray

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
        print("favorite button tapped")
    }
    favorite.backgroundColor = .orange

    let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
        print("share button tapped")
    }
    share.backgroundColor = .blue

    return [share, favorite, more]
}

还要实现这一点:(您可以将其设置为条件,但此处所有内容都是可编辑的)

override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

(旧版本)

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
        let more = UITableViewRowAction(style: .Normal, title: "More") { action, index in
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGrayColor()

        let favorite = UITableViewRowAction(style: .Normal, title: "Favorite") { action, index in
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orangeColor()

        let share = UITableViewRowAction(style: .Normal, title: "Share") { action, index in
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blueColor()

        return [share, favorite, more]
    }

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        // the cells you would like the actions to appear needs to be editable
        return true
    }

11
这不能回答问题。我们正在尝试使用swift向左滑动找到一个出路,但这并非如此
Somu 2015年

谢谢!这显然不能处理左右滑动,但我还是决定放弃该功能。唯一不清楚的是如何在按下可能会从表格中移动/删除单元格的按钮后使表格自动刷新?
Dave G'1

1
不知道您是否要tableview.reloadRowsAtIndexPaths ([indexpath] withRowAnimation: UITableViewRowAnimation.Automatic)删除tableview.deleteRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
jose920405 '16

2
是否可以通过点击单元格而不是对其进行滑动来打开“编辑操作”?
Heysem Katibi '16

1
Swift 3函数定义override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]?
David Corbin

28

这段代码对swift4很有用。

在此处输入图片说明

以上屏幕的答案是:

 func tableView(_ tableView: UITableView,
                   trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {
        // Write action code for the trash
        let TrashAction = UIContextualAction(style: .normal, title:  "Trash", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        TrashAction.backgroundColor = .red

        // Write action code for the Flag
        let FlagAction = UIContextualAction(style: .normal, title:  "Flag", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        FlagAction.backgroundColor = .orange

        // Write action code for the More
        let MoreAction = UIContextualAction(style: .normal, title:  "More", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("Update action ...")
            success(true)
        })
        MoreAction.backgroundColor = .gray


        return UISwipeActionsConfiguration(actions: [TrashAction,FlagAction,MoreAction])
    }

在此处输入图片说明

以上屏幕的答案:

 func tableView(_ tableView: UITableView,
                   leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
    {

        let closeAction = UIContextualAction(style: .normal, title:  "Mark as Read", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("CloseAction ...")
            success(true)
        })
        closeAction.backgroundColor = .blue
        return UISwipeActionsConfiguration(actions: [closeAction])

    }

同样编写tableview委托方法:-

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arrPerson.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let personName = arrPerson[indexPath.row]
        cell.textLabel?.text = personName.personName
        return cell

    }

并在viewDidLoad中

override func viewDidLoad() {
    super.viewDidLoad()

    tblView.delegate = self
    tblView.dataSource = self

    let person1 = personData(personName: "Jonny", personAge: 30)
    let person2 = personData(personName: "Chandan", personAge: 20)
    let person3 = personData(personName: "Gopal", personAge: 28)

   arrPerson.append(person1)
   arrPerson.append(person2)
   arrPerson.append(person3)

}

7
只用了3年:)感谢您的回答
罗恩·斯雷布罗

2
它适用于iOS 11+
cdub

21

您可以使用UITableView委托方法来请求这些操作。实施此方法如下:

- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewRowAction *modifyAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Modify" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
         // Respond to the action.
     }];
     modifyAction.backgroundColor = [UIColor blueColor];
     return @[modifyAction];
}

当然,您可以返回多个操作并自定义文本和背景色。

还需要实现此方法以使行可编辑:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}

我只需十几行代码就能获得所有这些功能?或者,您只是想将我最终使用的任何代码插入该函数中,即使给定的代码看起来都无法修改单元格。另外,尝试在Swift中解决此问题。
Dave G

是的,仅使用该代码即可获得所有功能。这是一个内置功能。哇,这甚至是正确的答案,有人不赞成。我很惊讶。
BalestraPatrick

请注意,此功能自iOS8 +起可用,并且仅允许您向左滑动,您必须进行自定义实现才能向右滑动。除此之外,还提供快速简便的答案
Jiri Trecak 2015年

谢谢你的分享。如果我不能胜任实现完整菜单的操作,则可以使用这种更简单的解决方案。我给它打了个赞成票,因为它很相关,但是我不能选择它作为答案,因为它没有回答如何模仿完整的iOS8 Mail菜单的问题,而且它是用Objective-C编写的。
Dave G

15

我找到了这个库MGSwipeTableCell, 在使用swift搜索了很多表格来实现表格视图中的滑动单元之后,我发现了这一库及其仅一行代码来执行,并发现它非常有用。

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
  {
    let reuseIdentifier = "programmaticCell"
    var cell = self.table.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
    if cell == nil
    {
      cell = MGSwipeTableCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier)
    }

    cell.textLabel!.text = "Title"
    cell.detailTextLabel!.text = "Detail text"
    cell.delegate = self //optional

    //configure left buttons
    cell.leftButtons = [MGSwipeButton(title: "", icon: UIImage(named:"check.png"), backgroundColor: UIColor.greenColor())
      ,MGSwipeButton(title: "", icon: UIImage(named:"fav.png"), backgroundColor: UIColor.blueColor())]
    cell.leftSwipeSettings.transition = MGSwipeTransition.Rotate3D

    //configure right buttons
    cell.rightButtons = [MGSwipeButton(title: "Delete", backgroundColor: UIColor.redColor())
      ,MGSwipeButton(title: "More",backgroundColor: UIColor.lightGrayColor())]
    cell.rightSwipeSettings.transition = MGSwipeTransition.Rotate3D

    return cell
  }

这就是您实现和更新pod文件的唯一功能


11

Swift 3完整解决方案:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        tableView.tableFooterView = UIView(frame: CGRect.zero) //Hiding blank cells.
        tableView.separatorInset = UIEdgeInsets.zero
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)

        return cell
    }

    //Enable cell editing methods.
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        return true
    }

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

    }

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        let more = UITableViewRowAction(style: .normal, title: "More") { action, index in
            //self.isEditing = false
            print("more button tapped")
        }
        more.backgroundColor = UIColor.lightGray

        let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in
            //self.isEditing = false
            print("favorite button tapped")
        }
        favorite.backgroundColor = UIColor.orange

        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            //self.isEditing = false
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue

        return [share, favorite, more]
    }

}

2

AFAIK没有内置的随时可用的解决方案,即使iOS9中提供了解决方案,您也可能无法使用它,因为在可预见的将来,您不仅只能在应用程序中支持iOS9。

相反,我建议您查看此库:

https://github.com/CEWendel/SWTableViewCell

它很容易配置,非常精致,并且在我从事的任何快速项目中都可以很好地工作。

希望能帮助到你!


谢谢。开发新手,之前从未使用过GitHub。我刚刚下载了zip文件,并使用X-Code打开了该项目,然后运行了该项目,但显示“ Build Failed”。在查看其工作原理之前,是否需要将代码合并到我的项目中?
Dave G

您最好将Cocoapods安装为依赖项管理器;这是行业标准,将为您省去很多麻烦。关于cocoapods的更多信息以及如何在此处使用它cocoapods.org
Jiri Trecak

谢谢Jiri,在简要阅读了有关CocoaPods的内容后,听起来我今晚必须做进一步的阅读才能理解它们。我很渴望,而不是运行github项目,而是开始查看代码。在目标C中!我的应用程序是Swift语言,这是我熟悉的语言。我是否必须将github解决方案转换为Swift,或者由于可以并行运行它们,我是否能够将Objective-C ViewController代码复制到我的BasicCellViewController中?
Dave G

使用cocoapods时,如果您使用的是iOS8 +,则可以并行运行库,目标C并快速运行库。然后,您可以在swift项目中无缝使用Obj-C代码(但它将隐藏在“ pods”项目下),唯一要做的就是在“ Bridging Header” developer.apple.com中
Jiri Trecak

刚刚读到有关CocoaPods(raywenderlich.com/97014/use-cocoapods-with-swift)的信息,我认为这对我的大脑来说实在是难以忍受。我得到了这个概念,但是在终端中实现了它,使用了工作区,使我的应用程序在不与其他代码合并的代码上运行...并调整实际的菜单功能以查看/操作我的期望...我的大脑会爆炸。研究如何将obj-c粘贴到其中,并告诉我的应用程序我同时使用两种语言。以前没有做过,但是看起来更简单
Dave G

1

这比您想像的要容易。这是带有实现的UITableView的Swift类的示例,并且具有滑动UITableViewCell的功能。

import UIKit

class ViewController: UIViewController {

    // MARK: Properties

    let strings = ["firstString", "secondString", "thirdString"]

    // MARK: Outlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    // MARK: UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
        let currentString = strings[indexPath.row]
        cell.textLabel?.text = currentString
        return cell
    }

    // MARK: UITableViewDelegate

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
    }

    func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let leftAction = UIContextualAction(style: .normal, title:  "Red", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("leftAction tapped")
            success(true)
        })

        leftAction.image = UIImage(named: "")
        leftAction.backgroundColor = UIColor.red

        return UISwipeActionsConfiguration(actions: [leftAction])
    }

    func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let rightAction = UIContextualAction(style: .normal, title:  "Green", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
            print("rightAction tapped")
            success(true)
        })

        rightAction.image = UIImage(named: "")
        rightAction.backgroundColor = UIColor.green

        return UISwipeActionsConfiguration(actions: [rightAction])
    }

}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.