ฉันจะรับปุ่มลบเพื่อแสดงเมื่อกวาดนิ้วได้UITableViewCell
อย่างไร เหตุการณ์จะไม่ถูกยกขึ้นและปุ่มลบจะไม่ปรากฏขึ้น
UITableViewCell
s
ฉันจะรับปุ่มลบเพื่อแสดงเมื่อกวาดนิ้วได้UITableViewCell
อย่างไร เหตุการณ์จะไม่ถูกยกขึ้นและปุ่มลบจะไม่ปรากฏขึ้น
UITableViewCell
s
คำตอบ:
ในระหว่างการเริ่มต้น(-viewDidLoad or in storyboard)
ทำ:
self.tableView.allowsMultipleSelectionDuringEditing = NO;
แทนที่เพื่อสนับสนุนการแก้ไขตามเงื่อนไขของมุมมองตาราง สิ่งนี้จะต้องดำเนินการถ้าคุณจะกลับมาNO
บางรายการ โดยค่าเริ่มต้นรายการทั้งหมดสามารถแก้ไขได้
- (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;
ให้ปัดซ้ายเพื่อทำงาน ดูเหมือนว่าเป็นข้อบกพร่องสำหรับฉันเพราะตารางไม่อยู่ในสถานะแก้ไข ตัวเลือกนี้ควรใช้ "ระหว่างการแก้ไข" เท่านั้น อย่างไรก็ตามมันใช้งานได้ในขณะนี้และฉันตั้งเป็น YES เมื่อใดก็ตามที่ตารางกำลังเข้าสู่สถานะการแก้ไข
คำตอบนี้ได้รับการอัพเดตเป็น Swift 3
ฉันมักจะคิดว่ามันเป็นเรื่องดีที่มีตัวอย่างง่าย ๆ ที่มีอยู่ในตัวเองดังนั้นจึงไม่มีสิ่งใดถูกสันนิษฐานได้เมื่อฉันเรียนรู้งานใหม่ คำตอบนี้คือการลบUITableView
แถว โครงการดำเนินการดังนี้:
โครงการนี้จะขึ้นอยู่กับตัวอย่าง UITableView สำหรับสวิฟท์
สร้างโครงการใหม่และแทนที่รหัส ViewController.swift ด้วยรายการต่อไปนี้
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.
}
}
}
วิธีการคีย์เดี่ยวในรหัสข้างต้นที่ช่วยให้การลบแถวเป็นวิธีสุดท้าย ที่นี่เป็นอีกครั้งสำหรับการเน้น:
// 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.
}
}
เพิ่มUITableView
ไปยัง View Controller ในกระดานเรื่องราว ใช้การจัดวางอัตโนมัติเพื่อปักหมุดทั้งสี่ด้านของมุมมองตารางไปที่ขอบของตัวควบคุมมุมมอง ควบคุมการลากจากมุมมองตารางในกระดานเรื่องราวไปยัง@IBOutlet var tableView: UITableView!
บรรทัดในรหัส
นั่นคือทั้งหมดที่ คุณควรจะสามารถเรียกใช้แอปของคุณได้ในขณะนี้และลบแถวโดยการกวาดนิ้วไปทางซ้ายแล้วแตะ "ลบ"
เปลี่ยนข้อความปุ่ม "ลบ"
เพิ่มวิธีการต่อไปนี้:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
การกระทำของปุ่มที่กำหนดเอง
เพิ่มวิธีการต่อไปนี้
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]
}
โปรดทราบว่านี่ใช้ได้เฉพาะจาก iOS 8 ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
อัปเดตสำหรับ iOS 11
การดำเนินการสามารถวางได้ทั้งส่วนนำหน้าและต่อท้ายเซลล์โดยใช้วิธีการที่เพิ่มเข้ากับ UITableViewDelegate API ใน 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
หนึ่งในนี้เป็นสมบูรณ์ยืนอยู่คนเดียวและโครงการที่คุณไม่จำเป็นต้องทำอะไรที่ไม่ได้อธิบายไว้ที่นี่ เหตุผลที่ฉันเริ่มตั้งรหัสเป็นเพราะต้องการคำอธิบายน้อยลงในคำตอบของฉัน ฉันควรกลับไปและแก้ไขตัวอย่างพื้นฐานเพื่อใช้รหัสด้วย
รหัสนี้แสดงวิธีการใช้การลบ
#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];
}
}
ในการแทนที่การกำหนดค่าเริ่มต้นของคุณให้เพิ่มบรรทัดด้านล่างเพื่อแสดงรายการปุ่มแก้ไข:
self.navigationItem.leftBarButtonItem = self.editButtonItem;
ฉันมีปัญหาที่ฉันเพิ่งจะแก้ไขเพื่อให้ฉันแบ่งปันมันเพราะมันอาจช่วยใครบางคน
ฉันมี UITableView และเพิ่มวิธีการที่แสดงเพื่อเปิดใช้งานรูดเพื่อลบ:
- (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
}
}
ฉันกำลังทำงานกับการอัปเดตที่ช่วยให้ฉันสามารถวางตารางลงในโหมดแก้ไขและเปิดใช้งานการเลือกหลายรายการ ในการทำเช่นนั้นฉันเพิ่มรหัสจากตัวอย่างTableMultiSelectของ Apple เมื่อฉันได้งานนั้นฉันพบว่าการปัดนิ้วของฉันฟังก์ชั่นลบหยุดทำงาน
ปรากฎว่าการเพิ่มบรรทัดต่อไปนี้เพื่อ viewDidLoad เป็นปัญหา:
self.tableView.allowsMultipleSelectionDuringEditing = YES;
เมื่อใช้บรรทัดนี้การเลือกหลายรายการจะใช้งานได้ แต่การปัดนิ้วเพื่อลบจะไม่ทำงาน หากไม่มีเส้นมันเป็นวิธีอื่น ๆ
การแก้ไข:
เพิ่มวิธีการต่อไปนี้ใน viewController ของคุณ:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
self.tableView.allowsMultipleSelectionDuringEditing = editing;
[super setEditing:editing animated:animated];
}
จากนั้นในวิธีการของคุณที่ทำให้ตารางเข้าสู่โหมดแก้ไข (ตัวอย่างเช่นกดปุ่ม) คุณควรใช้:
[self setEditing:YES animated:YES];
แทน:
[self.tableView setEditing:YES animated:YES];
ซึ่งหมายความว่าการเลือกหลายรายการจะเปิดใช้งานเฉพาะเมื่อตารางอยู่ในโหมดแก้ไข
ด้านล่าง UITableViewDataSource จะช่วยคุณในการลบแบบรูด
- (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];
}
}
arrYears เป็น NSMutableArray แล้วโหลด tableView อีกครั้ง
รวดเร็ว
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()
}
}
ใน iOS 8 และ Swift 2.0 โปรดลองสิ่งนี้
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]
}
@ คำตอบของ Kurbz นั้นยอดเยี่ยม แต่ฉันต้องการออกจากบันทึกนี้และหวังว่าคำตอบนี้จะช่วยให้ผู้คนประหยัดเวลาได้
ฉันมีบางครั้งบรรทัดเหล่านี้ในตัวควบคุมของฉันและพวกเขาทำให้คุณสมบัติการรูดไม่ทำงาน
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleNone;
}
หากคุณใช้UITableViewCellEditingStyleInsert
หรือUITableViewCellEditingStyleNone
เป็นสไตล์การแก้ไขคุณสมบัติการปัดจะไม่ทำงาน คุณสามารถใช้ได้เฉพาะUITableViewCellEditingStyleDelete
รูปแบบเริ่มต้นเท่านั้น
สวิฟท์ 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]
}
นอกจากนี้สามารถทำได้ใน SWIFT โดยใช้วิธีการดังต่อไปนี้
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
testArray.removeAtIndex(indexPath.row)
goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
สิ่งที่คุณต้องทำคือเปิดใช้งานฟังก์ชั่นทั้งสองนี้:
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()
}
}
ฉันรู้ว่าเป็นคำถามเก่า แต่ @Kurbz ตอบเพียงต้องการ Xcode 6.3.2 และ SDK 8.3
ฉันต้องการเพิ่ม[tableView beginUpdates]
และ[tableView endUpdates]
(ต้องขอบคุณ @ bay.phillips ที่นี่ )
// 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];
}
เมื่อคุณลบเซลล์ของ tableview ของคุณคุณต้องลบวัตถุอาร์เรย์ที่ index x
ฉันคิดว่าคุณสามารถลบออกได้โดยใช้การเลื่อนนิ้ว มุมมองตารางจะเรียกผู้แทน:
- (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 อีกครั้ง เพิ่มบรรทัดต่อไปนี้ในรหัสของคุณ:
[tableView reloadData];
หลังจากนั้นคุณลบแถวได้สำเร็จ และเมื่อคุณโหลดมุมมองหรือเพิ่มข้อมูลไปยังแหล่งข้อมูลวัตถุจะไม่อยู่ที่นั่นอีกต่อไป
สำหรับคนอื่น ๆ คือคำตอบจาก Kurbz ที่ถูกต้อง
ฉันแค่ต้องการเตือนคุณว่าฟังก์ชันผู้มอบหมายไม่เพียงพอหากคุณต้องการลบวัตถุออกจากอาร์เรย์ DataSource
ฉันหวังว่าฉันได้ช่วยคุณออก
[tableView reloadData]
[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];
}
}
สวิฟท์ 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]
}
สำหรับ Swift เพียงแค่เขียนรหัสนี้
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
print("Delete Hit")
}
}
สำหรับ Objective C เพียงแค่เขียนรหัสนี้
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"index: %@",indexPath.row);
}
}
สำหรับรหัส swift4 ก่อนอื่นให้เปิดใช้งานการแก้ไข:
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
จากนั้นคุณเพิ่มการดำเนินการลบไปยังผู้รับมอบสิทธิ์แก้ไข:
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]
}
สวิฟท์ 4,5
หากต้องการลบเซลล์ด้วยการปัดมีสองวิธีในตัวของ UITableView เขียนวิธีนี้ใน TableView dataSource extension
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
}
หากคุณใช้แหล่งข้อมูลแบบกระจายคุณจะต้องย้ายการเรียกกลับผู้รับมอบสิทธิ์ไปยังUITableViewDiffableDataSource
คลาสย่อย ตัวอย่างเช่น:
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)
}
}
}
}