UITableViewCell, 스 와이프시 삭제 버튼 표시
에서 스 와이프 할 때 삭제 버튼을 표시하려면 어떻게해야 UITableViewCell
합니까? 이벤트가 발생하지 않으며 삭제 버튼이 나타나지 않습니다.
(-viewDidLoad or in storyboard)
do 에서 시작하는 동안 :
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
}
}
이 답변은 Swift 3로 업데이트되었습니다.
나는 항상 새로운 과제를 배울 때 아무것도 가정하지 않도록 매우 간단하고 독립적 인 예제를 갖는 것이 좋다고 생각합니다. 이 대답은 UITableView
행 을 삭제하는 것입니다 . 프로젝트는 다음과 같이 수행됩니다.
이 프로젝트는 Swift 용 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 용으로 업데이트 됨
액션은 iOS 11의 UITableViewDelegate API에 추가 된 메소드를 사용하여 셀의 선행 또는 후행에 배치 될 수 있습니다.
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])
}
추가 읽기
이 코드는 삭제를 구현하는 방법을 보여줍니다.
#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;
참고 : Kurbz의 답변에 댓글을 올릴만한 평판이 충분하지 않습니다.
Kurbz의 대답은 옳습니다. 그러나 나에게는 결코 효과가 없었습니다.
몇 가지 조사 끝에 테이블 뷰를 편집하지 않을 때 스 와이프하여 삭제가 발생 한다는 것을 깨달았습니다 . .
나는 이것이 그렇게 명시 적으로 언급 된 것을 본 적이 없다. 내가 착각하지 않는 한, 나는 그것을 작동시킬 다른 방법을 찾지 못했습니다.
편집 할 때 삭제 및 / 또는 재정렬 컨트롤이 표시됩니다.
방금 해결 한 문제가있어서 누군가에게 도움이 될 수 있으므로 공유하고 있습니다.
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
}
}
테이블을 편집 모드로 전환하고 다중 선택을 활성화 할 수있는 업데이트를 작업 중입니다. 이를 위해 Apple의 TableMultiSelect 샘플 에서 코드를 추가했습니다 . 내가 그 일을하게되자 나는 내 슬쩍 삭제 기능이 작동을 멈췄다는 것을 알았습니다.
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)
}
}
스위프트 3
다음 두 기능을 활성화하기 만하면됩니다.
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의 셀을 제거 할 때 인덱스 x에서 배열 개체도 제거해야합니다.
스 와이프 제스처를 사용하여 제거 할 수 있다고 생각합니다. 테이블보기는 Delegate를 호출합니다.
- (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];
그 후에 행을 성공적으로 삭제했습니다. 뷰를 다시로드하거나 DataSource에 데이터를 추가하면 개체가 더 이상 존재하지 않습니다.
다른 모든 것은 Kurbz의 대답입니다.
DataSource 배열에서 개체를 제거하려는 경우 델리게이트 함수로는 충분하지 않다는 점을 상기시키고 싶었습니다.
내가 당신을 도왔기를 바랍니다.
- (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]
}
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]
}
참고 URL : https://stackoverflow.com/questions/3309484/uitableviewcell-show-delete-button-on-swipe
'Development Tip' 카테고리의 다른 글
날짜 문자열을 다른 형식으로 변환하는 방법 (0) | 2020.10.04 |
---|---|
응용 프로그램 구성 파일의 연결 문자열 'MyConnection'에 필수 providerName 특성이 없습니다. " (0) | 2020.10.04 |
Twitter 부트 스트랩 양식 파일 요소 업로드 버튼 (0) | 2020.10.03 |
자바 스크립트의 코드 구성과 관련하여 일반적으로 인정되는 모범 사례 (0) | 2020.10.03 |
Java 클래스 파일을 "디 컴파일"하려면 어떻게합니까? (0) | 2020.10.03 |