Fork me on GitHub

开始用Swift开发iOS 10 - 9 Table Row的删除, UITableViewRowAction和UIActivityViewController的使用

上一篇开始用Swift开发iOS 10 - 8 Table View和UIAlertController的交互是Table Row选择的操作,这一篇继续上一篇的代码实现删除操作。

滑动删除

  • 实现UITableViewDataSource中相应方法:
    1
    2
    3
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    }

此时滑动有删除按钮:

  • 删除数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
    restaurantNames.remove(at: indexPath.row)
    restaurantLocations.remove(at: indexPath.row)
    restaurantTypes.remove(at: indexPath.row)
    restaurantIsVisited.remove(at: indexPath.row)
    restaurantImages.remove(at: indexPath.row)
    }
    }

UITableViewCellEditingStyle有两种insertdelete
运行后发现删除动作后,相应的table view row被没有消失,因为上面的删除只是删除了相应数组中的数据,并没有在视图上显示,如要重新加载才会删除。

重新加载UITableView

tableView(_:commit:forRowAt:)后添加:
tableView.reloadData()
另外,更好的刷新table view的方法是使用UITableViewdeleteRows(at:with:)方法,还有动画效果:
tableView.deleteRows(at: [indexPath], with: .fade)

用UITableViewRowAction为滑动产生更多动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
// 1
let shareAction = UITableViewRowAction(style: .default, title: "Share", handler: {
(action, indexPath) -> Void in
// 3
let defaultText = "Just checking in at " + self.restaurantNames[indexPath.row]
let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
self.present(activityController, animated: true, completion: nil)
})
// 1
let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: {
(action, indexPath) -> Void in

self.restaurantNames.remove(at: indexPath.row)
self.restaurantLocations.remove(at: indexPath.row)
self.restaurantTypes.remove(at: indexPath.row)
self.restaurantIsVisited.remove(at: indexPath.row)
self.restaurantImages.remove(at: indexPath.row)

})
// 2
return [deleteAction, shareAction]
}
  • 1 UITableViewRowAction的用法和UIAlertAction类似。style相同,具体功能是在回调闭包中实现的。
  • UIActivityViewController继承是UIViewController,提供一些服务,例如拷贝到剪贴板,分享内容到社交媒体,通过Messages发送项目等。
  • 一旦实现了tableView(_:editActionsForRowAt:)方法,tableView(_:commit:forRowAt:)方法产生delete按钮将不再产生,所以要在tableView(_:commit:forRowAt:)中添加delete按钮。
  • 2 返回的UITableViewRowAction的数组,action的显示顺序是,按照数组的顺序在屏幕从有到左显示。
  • 3 defaultText是分享的内容,不仅可以是文本,也可以添加图片对象UIImage。此处代码修改一下:
    1
    2
    3
    4
    5
    let defaultText = "Just checking in at " + self.restaurantNames[indexPath.row]
    if let imageToShare = UIImage(named: self.restaurantImages[indexPath.row]) {
    let activityController = UIActivityViewController(activityItems: [defaultText, imageToShare], applicationActivities: nil)
    self.present(activityController, animated: true, completion: nil)
    }

3407495D-9E60-4E6C-8EFA-31A562A14907.png

定制UITableViewRowAction

可以修改背景颜色:

1
2
3
4
shareAction.backgroundColor = UIColor(red: 48.0/255.0, green: 173.0/255.0,
blue: 99.0/255.0, alpha: 1.0)
deleteAction.backgroundColor = UIColor(red: 202.0/255.0, green: 202.0/255.0,
blue: 203.0/255.0, alpha: 1.0)

代码

Beginning-iOS-Programming-with-Swift

说明

此文是学习appcode网站出的一本书 《Beginning iOS 10 Programming with Swift》 的一篇记录

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文标题: 开始用Swift开发iOS 10 - 9 Table Row的删除, UITableViewRowAction和UIActivityViewController的使用
  • 本文作者: AndyRon
  • 发布时间: 2017年07月12日 - 00:00
  • 最后更新: 2017年09月09日 - 13:02
  • 本文链接: http://andyron.com/2017/beginning-ios-swift-9.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!