Làm cách nào để có được nút xóa để hiển thị khi vuốt trên a UITableViewCell
? Sự kiện này không bao giờ được nêu ra và nút xóa không bao giờ xuất hiện.
UITableViewCell
s.
Làm cách nào để có được nút xóa để hiển thị khi vuốt trên a UITableViewCell
? Sự kiện này không bao giờ được nêu ra và nút xóa không bao giờ xuất hiện.
UITableViewCell
s.
Câu trả lời:
Trong quá trình khởi động tại (-viewDidLoad or in storyboard)
:
self.tableView.allowsMultipleSelectionDuringEditing = NO;
Ghi đè để hỗ trợ chỉnh sửa có điều kiện của chế độ xem bảng. Điều này chỉ cần được thực hiện nếu bạn sẽ trở lại NO
cho một số mặt hàng. Theo mặc định, tất cả các mục có thể chỉnh sửa.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return YES if you want the specified item to be editable.
return YES;
}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//add code here for when you hit delete
}
}
self.tableView.allowsMultipleSelectionDuringEditing = NO;
cho thao tác vuốt sang trái để hoạt động. Điều này nghe có vẻ như là một lỗi đối với tôi vì bảng KHÔNG ở trạng thái chỉnh sửa. Tùy chọn này chỉ nên áp dụng "Trong khi chỉnh sửa". Tuy nhiên, nó hoạt động ngay bây giờ và tôi đặt nó thành CÓ mỗi khi bảng đang ở trạng thái chỉnh sửa.
Câu trả lời này đã được cập nhật lên Swift 3
Tôi luôn nghĩ thật tuyệt khi có một ví dụ rất đơn giản, khép kín để không có gì được giả định khi tôi đang học một nhiệm vụ mới. Câu trả lời này là để xóa UITableView
các hàng. Dự án thực hiện như thế này:
Dự án này dựa trên ví dụ UITableView cho Swift .
Tạo một dự án mới và thay thế mã ViewControll.swift bằng cách sau.
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// These strings will be the data for the table view cells
var animals: [String] = ["Horse", "Cow", "Camel", "Pig", "Sheep", "Goat"]
let cellReuseIdentifier = "cell"
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// It is possible to do the following three things in the Interface Builder
// rather than in code if you prefer.
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
tableView.delegate = self
tableView.dataSource = self
}
// number of rows in table view
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.animals.count
}
// create a cell for each table view row
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!
cell.textLabel?.text = self.animals[indexPath.row]
return cell
}
// method to run when table view cell is tapped
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("You tapped cell number \(indexPath.row).")
}
// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// remove the item from the data model
animals.remove(at: indexPath.row)
// delete the table view row
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Not used in our example, but if you were adding a new row, this is where you would do it.
}
}
}
Phương thức khóa đơn trong mã ở trên cho phép xóa hàng là cách cuối cùng. Đây là một lần nữa để nhấn mạnh:
// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
// remove the item from the data model
animals.remove(at: indexPath.row)
// delete the table view row
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Not used in our example, but if you were adding a new row, this is where you would do it.
}
}
Thêm một UITableView
vào Trình điều khiển xem trong bảng phân cảnh. Sử dụng bố trí tự động để ghim bốn cạnh của chế độ xem bảng vào các cạnh của Trình điều khiển xem. Kiểm soát kéo từ chế độ xem bảng trong bảng phân cảnh đến @IBOutlet var tableView: UITableView!
dòng trong mã.
Đó là tất cả. Bạn sẽ có thể chạy ứng dụng của mình ngay bây giờ và xóa các hàng bằng cách vuốt sang trái và nhấn "Xóa".
Thay đổi văn bản nút "Xóa"
Thêm phương pháp sau:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
Hành động nút tùy chỉnh
Thêm phương pháp sau.
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
// action one
let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
print("Edit tapped")
})
editAction.backgroundColor = UIColor.blue
// action two
let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
print("Delete tapped")
})
deleteAction.backgroundColor = UIColor.red
return [editAction, deleteAction]
}
Lưu ý rằng điều này chỉ có sẵn từ iOS 8. Xem câu trả lời này để biết thêm chi tiết.
Đã cập nhật cho iOS 11
Các hành động có thể được đặt hoặc dẫn đầu ô theo các phương thức được thêm vào API UITableViewDelegate trong iOS 11.
func tableView(_ tableView: UITableView,
leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
{
let editAction = UIContextualAction(style: .normal, title: "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
success(true)
})
editAction.backgroundColor = .blue
return UISwipeActionsConfiguration(actions: [editAction])
}
func tableView(_ tableView: UITableView,
trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
{
let deleteAction = UIContextualAction(style: .normal, title: "Delete", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
success(true)
})
deleteAction.backgroundColor = .red
return UISwipeActionsConfiguration(actions: [deleteAction])
}
UITableView
một , đây là một dự án hoàn toàn một mình đứng và bạn không cần phải làm bất cứ điều gì mà không được mô tả ở đây. Lý do tôi bắt đầu đặt nó trong mã là vì nó yêu cầu ít lời giải thích hơn trong câu trả lời của tôi. Tôi cũng nên quay lại và chỉnh sửa ví dụ cơ bản để sử dụng mã.
Mã này cho thấy làm thế nào để thực hiện xóa.
#pragma mark - UITableViewDataSource
// Swipe to delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_chats removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
Tùy chọn, trong phần ghi đè khởi tạo của bạn, hãy thêm dòng bên dưới để hiển thị mục nút Chỉnh sửa:
self.navigationItem.leftBarButtonItem = self.editButtonItem;
Tôi có một vấn đề mà tôi vừa mới giải quyết được nên tôi chia sẻ nó vì nó có thể giúp được ai đó.
Tôi có một UITableView và đã thêm các phương thức được hiển thị để cho phép vuốt để xóa:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return YES if you want the specified item to be editable.
return YES;
}
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//add code here for when you hit delete
}
}
Tôi đang làm việc trên một bản cập nhật cho phép tôi đặt bảng vào chế độ chỉnh sửa và cho phép đa lựa chọn. Để làm điều đó, tôi đã thêm mã từ mẫu TableMultiSelect của Apple . Khi tôi đã làm việc, tôi thấy rằng chức năng xóa của tôi đã ngừng hoạt động.
Hóa ra việc thêm dòng sau vào viewDidLoad là vấn đề:
self.tableView.allowsMultipleSelectionDuringEditing = YES;
Với dòng này, multiselect sẽ hoạt động nhưng thao tác vuốt để xóa sẽ không. Không có dòng đó là cách khác.
Cách khắc phục:
Thêm phương thức sau vào viewContoder của bạn:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
self.tableView.allowsMultipleSelectionDuringEditing = editing;
[super setEditing:editing animated:animated];
}
Sau đó, trong phương thức của bạn đặt bảng vào chế độ chỉnh sửa (ví dụ từ một nút nhấn), bạn nên sử dụng:
[self setEditing:YES animated:YES];
thay vì:
[self.tableView setEditing:YES animated:YES];
Điều này có nghĩa là multiselect chỉ được bật khi bảng ở chế độ chỉnh sửa.
Bên dưới UITableViewDataSource sẽ giúp bạn xóa xóa
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return YES if you want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[arrYears removeObjectAtIndex:indexPath.row];
[tableView reloadData];
}
}
ArrayYears là một NSMutableArray và sau đó tải lại bảngView
Nhanh
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyleDelete {
arrYears.removeObjectAtIndex(indexPath.row)
tableView.reloadData()
}
}
Trong iOS 8 và Swift 2.0, vui lòng thử điều này,
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// let the controller to know that able to edit tableView's row
return true
}
override func tableView(tableView: UITableView, commitEdittingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
// if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}
override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
// add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in
// Your delete code here.....
.........
.........
})
// You can set its properties like normal button
deleteAction.backgroundColor = UIColor.redColor()
return [deleteAction]
}
Câu trả lời của @ Kurbz thật tuyệt vời, nhưng tôi muốn để lại ghi chú này và hy vọng câu trả lời này có thể giúp mọi người tiết kiệm thời gian.
Thỉnh thoảng tôi có những dòng này trong bộ điều khiển của mình và chúng làm cho tính năng vuốt không hoạt động.
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleNone;
}
Nếu bạn sử dụng UITableViewCellEditingStyleInsert
hoặc UITableViewCellEditingStyleNone
làm kiểu chỉnh sửa, thì tính năng vuốt không hoạt động. Bạn chỉ có thể sử dụng UITableViewCellEditingStyleDelete
, đó là phong cách mặc định.
Swift 4
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
// delete item at indexPath
tableView.deleteRows(at: [indexPath], with: .fade)
}
return [delete]
}
Ngoài ra, điều này có thể đạt được trong SWIFT bằng phương pháp như sau
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
testArray.removeAtIndex(indexPath.row)
goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
Tất cả bạn phải làm là kích hoạt hai chức năng này:
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
tableView.reloadData()
}
}
Tôi biết là câu hỏi cũ, nhưng câu trả lời @Kurbz chỉ cần câu hỏi này cho Xcode 6.3.2 và SDK 8.3
Tôi cần thêm [tableView beginUpdates]
và [tableView endUpdates]
(cảm ơn @ bay.phillips tại đây )
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
// Open "Transaction"
[tableView beginUpdates];
if (editingStyle == UITableViewCellEditingStyleDelete) {
// your code goes here
//add code here for when you hit delete
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
// Close "Transaction"
[tableView endUpdates];
}
Khi bạn loại bỏ một ô của chế độ xem bảng của bạn, bạn cũng phải xóa đối tượng mảng của mình tại chỉ mục x.
Tôi nghĩ bạn có thể loại bỏ nó bằng cách sử dụng cử chỉ vuốt. Chế độ xem bảng sẽ gọi Đại biểu:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
//add code here for when you hit delete
[dataSourceArray removeObjectAtIndex:indexPath.row];
}
}
Sau khi gỡ đối tượng. Bạn phải tải lại việc sử dụng xem bàn. Thêm dòng sau vào mã của bạn:
[tableView reloadData];
Sau đó, bạn đã xóa hàng thành công. Và khi bạn tải lại chế độ xem hoặc thêm dữ liệu vào DataSource, đối tượng sẽ không còn ở đó nữa.
Đối với tất cả khác là câu trả lời từ Kurbz chính xác.
Tôi chỉ muốn nhắc bạn rằng hàm ủy nhiệm sẽ không đủ nếu bạn muốn xóa đối tượng khỏi mảng DataSource.
Tôi hy vọng tôi đã giúp bạn ra ngoài.
[tableView reloadData]
thoại [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]
.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete)
{
//add code here for when you hit delete
[dataSourceArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
Swift 2.2:
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
override func tableView(tableView: UITableView,
editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
let delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "DELETE"){(UITableViewRowAction,NSIndexPath) -> Void in
print("Your action when user pressed delete")
}
let edit = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "EDIT"){(UITableViewRowAction,NSIndexPath) -> Void in
print("Your action when user pressed edit")
}
return [delete, block]
}
Đối với Swift, chỉ cần viết mã này
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
print("Delete Hit")
}
}
Đối với mục tiêu C, chỉ cần viết mã này
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"index: %@",indexPath.row);
}
}
đối với mã swift4, trước tiên cho phép chỉnh sửa:
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
sau đó bạn thêm hành động xóa vào đại biểu chỉnh sửa:
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
let action = UITableViewRowAction(style: .destructive, title: "Delete") { (_, index) in
// delete model object at the index
self.models[index.row]
// then delete the cell
tableView.beginUpdates()
tableView.deleteRows(at: [index], with: .automatic)
tableView.endUpdates()
}
return [action]
}
Swift 4,5
Để xóa một ô khi vuốt, có hai phương thức được xây dựng trong UITableView.Write phương thức này trong phần mở rộng DataSource của TableView.
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let delete = deleteProperty(at: indexPath)
return UISwipeActionsConfiguration(actions: [delete])
}
//Declare this method in Viewcontroller Main and modify according to your need
func deleteProperty(at indexpath: IndexPath) -> UIContextualAction {
let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, completon) in
self.yourArray.remove(at: indexpath) //Removing from array at selected index
completon(true)
action.backgroundColor = .red //cell background color
}
return action
}
Nếu bạn đang áp dụng các nguồn dữ liệu có thể phân tán, bạn sẽ phải chuyển các cuộc gọi lại ủy nhiệm sang một UITableViewDiffableDataSource
lớp con. Ví dụ:
class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
if let identifierToDelete = itemIdentifier(for: indexPath) {
var snapshot = self.snapshot()
snapshot.deleteItems([identifierToDelete])
apply(snapshot)
}
}
}
}