developer tip

스 와이프를 활성화하여 TableView에서 셀을 삭제하는 방법은 무엇입니까?

optionbox 2020. 10. 21. 07:58
반응형

스 와이프를 활성화하여 TableView에서 셀을 삭제하는 방법은 무엇입니까?


UIViewControllerTableViews 위임 및 데이터 소스 프로토콜 을 구현 하는 것이 있습니다. 이제 셀에 "스 와이프하여 삭제"제스처를 추가하고 싶습니다.

어떻게해야합니까.

commitEditingStyle메서드 의 빈 구현을 제공 하고 Editing 속성을 YES로 설정했습니다.

여전히 스 와이프 기능은 제공되지 않습니다.

이제 UISwipeGesture각 셀 에 별도로 추가해야 합니까?

아니면 내가 뭔가를 놓치고 있습니까?


editing:YES셀 스 와이프에서 삭제 버튼을 표시해야하는 경우 설정할 필요 가 없습니다 . tableView:canEditRowAtIndexPath:편집 / 삭제해야하는 행 을 구현 하고 거기에서 YES를 반환해야합니다. tableView의 dataSource가 UITableViewContoller의 하위 클래스 인 경우에는 필요하지 않습니다.이 메서드는 재정의되지 않은 경우 기본적으로 YES를 반환합니다. 다른 모든 경우에는이를 구현해야합니다.

편집 : 함께 문제를 발견했습니다. 테이블이 편집 모드에 있지 않은 경우 tableView:editingStyleForRowAtIndexPath:반환 UITableViewCellEditingStyleNone됩니다.


으로 위의 댓글을 달았습니다, 다음과 같은 테이블 뷰 대리자 메서드를 구현해야합니다 :

  1. tableView:canEditRowAtIndexPath:
  2. 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

반응형