스 와이프를 활성화하여 TableView에서 셀을 삭제하는 방법은 무엇입니까?
UIViewController
TableViews 위임 및 데이터 소스 프로토콜 을 구현 하는 것이 있습니다. 이제 셀에 "스 와이프하여 삭제"제스처를 추가하고 싶습니다.
어떻게해야합니까.
commitEditingStyle
메서드 의 빈 구현을 제공 하고 Editing 속성을 YES로 설정했습니다.
여전히 스 와이프 기능은 제공되지 않습니다.
이제 UISwipeGesture
각 셀 에 별도로 추가해야 합니까?
아니면 내가 뭔가를 놓치고 있습니까?
editing:YES
셀 스 와이프에서 삭제 버튼을 표시해야하는 경우 설정할 필요 가 없습니다 . tableView:canEditRowAtIndexPath:
편집 / 삭제해야하는 행 을 구현 하고 거기에서 YES를 반환해야합니다. tableView의 dataSource가 UITableViewContoller의 하위 클래스 인 경우에는 필요하지 않습니다.이 메서드는 재정의되지 않은 경우 기본적으로 YES를 반환합니다. 다른 모든 경우에는이를 구현해야합니다.
편집 : 함께 문제를 발견했습니다. 테이블이 편집 모드에 있지 않은 경우 tableView:editingStyleForRowAtIndexPath:
반환 UITableViewCellEditingStyleNone
됩니다.
으로 댄 위의 댓글을 달았습니다, 다음과 같은 테이블 뷰 대리자 메서드를 구현해야합니다 :
tableView:canEditRowAtIndexPath:
tableView:commitEditingStyle:forRowAtIndexPath:
참고 : iOS 6 및 iOS 7에서 시도했습니다.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return YES - we will be able to delete all rows
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Perform the real delete action here. Note: you may need to check editing style
// if you do not perform delete only.
NSLog(@"Deleted row.");
}
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not 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) {
// Delete the row from the data source
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
이 코드를 신속하게 시도하십시오.
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, commitEditingStyle 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]
}
수업에 다음을 추가해보세요.
// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return(YES);
}
Kyr Dunenkoff 채팅의 결론 은
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
}
스 와이프 할 때 삭제 버튼을 표시해야하는 경우 정의하면 안됩니다.
를 사용 NSFetchedResultsControllerDelegate
하여 테이블 뷰를 채우는 경우 이것은 나를 위해 일했습니다.
tableView:canEditRowAtIndexPath
항상 true를 반환 하는지 확인하십시오.당신에
tableView:commitEditingStyle:forRowAtIndexPath
구현, 테이블 뷰에서 직접 행을 삭제하지 마십시오. 대신 관리되는 개체 컨텍스트를 사용하여 삭제하십시오. 예 :if editingStyle == UITableViewCellEditingStyle.Delete { let word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word self.managedObjectContext.deleteObject(word) self.saveManagedObjectContext() } func saveManagedObjectContext() { do { try self.managedObjectContext.save() } catch { let saveError = error as NSError print("\(saveError), \(saveError.userInfo)") } }
이것은 빠른 버전입니다
// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return NO if you do not want the specified item to be editable.
return true
}
// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Delete the row from the data source
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
이것은 나에게도 문제였습니다. 10 회 정도 시도 할 때마다 작업을 삭제하기 위해 스 와이프 할 수있었습니다. gesture
부모 뷰 컨트롤러의 다른 제스처에 의해 TV의 전원이 차단 된 것으로 나타났습니다 . TV가 MMDrawerController
(스 와이프 가능한 서랍 레이아웃) 에 중첩되었습니다 .
서랍 컨트롤러의 제스처 인식기를 측면 서랍의 닫는 제스처에 응답하지 않도록 구성하기 만하면 스 와이프를 삭제하여 TV에서 작동 할 수있었습니다.
다음과 같이 시도해 볼 수도 있습니다 gesture delegate
.
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
당신이해야합니다 같은 내 경험에 의하면, 보인다 editing
에서 UITableView
에 세트를 NO
작업에 강타합니다.
self.tableView.editing = NO;
iOS 8.0 이후에는 다음에서 작업을 사용자 정의 할 수 있습니다.
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
NSMutableArray *post= [NSMutableArray alloc]initWithObject:@"1",@"2",@"3",nil];
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView
editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSUInteger count = [posts count];
if (row < count) {
return UITableViewCellEditingStyleDelete;
} else {
return UITableViewCellEditingStyleNone;
}
}
- (void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSUInteger count = [posts count];
if (row < count) {
[posts removeObjectAtIndex:row];
}
}
XCode 5에서 UITableViewController 클래스 (임시)를 생성하여 필요한 모든 메소드를 확인한 다음 사용할 메소드를 복사합니다. 필요한 방법은 원하는 줄에 미리 채워져 주석 처리됩니다.
참고 URL : https://stackoverflow.com/questions/8983094/how-to-enable-swipe-to-delete-cell-in-a-tableview
'developer tip' 카테고리의 다른 글
Enumeration이 java.utils의 List가 아닌 ArrayList로 변환되는 이유는 무엇입니까? (0) | 2020.10.22 |
---|---|
최대 절전 양방향 매핑으로 인한 json serializer의 순환 참조를 해결하는 방법은 무엇입니까? (0) | 2020.10.22 |
symfony2 애플리케이션의 Angularjs (0) | 2020.10.21 |
memcached가 어떤 일을하고 있는지 어떻게 알 수 있습니까? (0) | 2020.10.21 |
JVM에서 JIT 컴파일 된 코드를 보는 방법은 무엇입니까? (0) | 2020.10.21 |