有什么方法可以滑动以删除/将操作添加到 UITableview Diffable 数据源中的单元格中?
Is there any way to swipe to delete/ Add actions into cell in UITableview Diffable datasource?
我正在尝试将滑动操作添加到我的表格视图中。当我使用简单的 tableview 数据源方法时,它工作正常 (trailingSwipeActionsConfigurationForRowAt)。但是当我用 Diffable 数据源尝试同样的事情时,它甚至没有调用滑动方法。我使用断点进行跟进,但没有用。
我正在使用 swift 5 (UIKit), Xcode 12.4
我通过以下方法解决了这个问题:
使用 diffable 数据源的 subclass 如下。
class GrocDataSource: UITableViewDiffableDataSource <GrocListSections, Grocs> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if indexPath.section == 0 || indexPath.section == 2 {
return true
} else {
return false
}
}
}
将此 class 实施到数据源中:
datasource = GrocDataSource(tableView: grocTableView, cellProvider: { (tableView, indexPath, grocs) in
guard let cell = tableView.dequeueReusableCell(withIdentifier: "GrocNameCell", for: indexPath) as? GrocNameCell else {return UITableViewCell()}
return cell })
写了一个demo,效果不错。
CustomDiffableDataSource.swift
import UIKit
enum Section: CaseIterable {
case main
}
struct City: Hashable {
var name: String
let identifier = UUID()
func contains(query: String?) -> Bool {
guard let query = query else {
return true
}
guard !query.isEmpty else {
return true
}
return name.contains(query)
}
}
class CustomDiffableDataSource: UITableViewDiffableDataSource<Section, City> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
print("delete")
// get item data
guard let item = itemIdentifier(for: indexPath) else {
return
}
print("item: ", item)
}
}
TableViewController.swift
import UIKit
class TableViewController: UITableViewController {
lazy var cities: [City] = {
let cityNames = ["A", "B", "C", "D", "E", "F", "G"]
var cities = [City]()
for name in cityNames {
cities.append(City(name: name))
}
return cities
}()
var dataSource: UITableViewDiffableDataSource<Section, City>!
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
createDataSource()
}
func createDataSource() {
dataSource = CustomDiffableDataSource(tableView: tableView, cellProvider: { tableView, _, city in
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = city.name
return cell
})
dataSource.defaultRowAnimation = .fade
show()
}
func show() {
var snapshot = dataSource.snapshot()
snapshot.appendSections([.main])
snapshot.appendItems(cities, toSection: .main)
dataSource.apply(snapshot, animatingDifferences: true)
}
}
我正在尝试将滑动操作添加到我的表格视图中。当我使用简单的 tableview 数据源方法时,它工作正常 (trailingSwipeActionsConfigurationForRowAt)。但是当我用 Diffable 数据源尝试同样的事情时,它甚至没有调用滑动方法。我使用断点进行跟进,但没有用。 我正在使用 swift 5 (UIKit), Xcode 12.4
我通过以下方法解决了这个问题: 使用 diffable 数据源的 subclass 如下。
class GrocDataSource: UITableViewDiffableDataSource <GrocListSections, Grocs> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if indexPath.section == 0 || indexPath.section == 2 {
return true
} else {
return false
}
}
}
将此 class 实施到数据源中:
datasource = GrocDataSource(tableView: grocTableView, cellProvider: { (tableView, indexPath, grocs) in
guard let cell = tableView.dequeueReusableCell(withIdentifier: "GrocNameCell", for: indexPath) as? GrocNameCell else {return UITableViewCell()}
return cell })
写了一个demo,效果不错。
CustomDiffableDataSource.swift
import UIKit
enum Section: CaseIterable {
case main
}
struct City: Hashable {
var name: String
let identifier = UUID()
func contains(query: String?) -> Bool {
guard let query = query else {
return true
}
guard !query.isEmpty else {
return true
}
return name.contains(query)
}
}
class CustomDiffableDataSource: UITableViewDiffableDataSource<Section, City> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
print("delete")
// get item data
guard let item = itemIdentifier(for: indexPath) else {
return
}
print("item: ", item)
}
}
TableViewController.swift
import UIKit
class TableViewController: UITableViewController {
lazy var cities: [City] = {
let cityNames = ["A", "B", "C", "D", "E", "F", "G"]
var cities = [City]()
for name in cityNames {
cities.append(City(name: name))
}
return cities
}()
var dataSource: UITableViewDiffableDataSource<Section, City>!
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
createDataSource()
}
func createDataSource() {
dataSource = CustomDiffableDataSource(tableView: tableView, cellProvider: { tableView, _, city in
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
cell?.textLabel?.text = city.name
return cell
})
dataSource.defaultRowAnimation = .fade
show()
}
func show() {
var snapshot = dataSource.snapshot()
snapshot.appendSections([.main])
snapshot.appendItems(cities, toSection: .main)
dataSource.apply(snapshot, animatingDifferences: true)
}
}