UITableView vô hiệu hóa vuốt để xóa, nhưng vẫn có xóa trong chế độ Chỉnh sửa?


91

Tôi muốn một cái gì đó tương tự như ứng dụng Báo thức, nơi bạn không thể vuốt để xóa hàng, nhưng bạn vẫn có thể xóa hàng trong chế độ Chỉnh sửa.

Khi được nhận xét ra tableView: commitE EditStyle: forRowAtIndexPath :, Tôi đã tắt thao tác vuốt để xóa và vẫn có nút Xóa ở chế độ Chỉnh sửa, nhưng điều gì sẽ xảy ra khi tôi nhấn nút Xóa. Cái gì được gọi là?

Câu trả lời:


286

Ok, nó hóa ra là khá dễ dàng. Đây là những gì tôi đã làm để giải quyết vấn đề này:

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

Swift 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

Swift 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

Bạn vẫn cần phải triển khai tableView:commitEditingStyle:forRowAtIndexPath:để thực hiện việc xóa.


bu sau đó vuốt để xóa sẽ tự động được bật lại. Hay không?
Massimo Cafaro

Không, vuốt để xóa không được bật nếu nó không ở chế độ chỉnh sửa. Đó là lý do tại sao tôi trả về UITableViewCellE EditStyleNone làm mặc định.
willi

3
Quên đề cập đến những gì bạn cần if (editingStyle == UITableViewCellEditingStyleDelete) trong commitEditingStyle:
Willi

Ok, với câu lệnh này, bạn có hành động xóa nhưng nó có hình ảnh khác nhau. Có cơ hội nào để thực hiện hành động đó với hình ảnh tương tự của phiên bản vuốt không?
Göktuğ Aral

@giuseppe Không thành vấn đề. Anh ấy không sai khi nhắc lại bản thân. Phương thức ủy nhiệm đó đang tham chiếu trở lại cùng một tableView nên anh ta có thể sử dụng hoặc.
Stephen Paul

9

Chỉ để làm rõ ràng mọi thứ, thao tác vuốt để xóa sẽ không được bật trừ khi tableView:commitEditingStyle:forRowAtIndexPath:được triển khai.

Trong khi đang trong quá trình phát triển, tôi đã không triển khai nó và do đó tính năng vuốt để xóa không được bật. Tất nhiên, trong một ứng dụng đã hoàn thiện, nó sẽ luôn được triển khai, vì nếu không sẽ không có chỉnh sửa.


4

Phiên bản Swift:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

Bạn cần triển khai chức năng CanEditRowAt.

Bạn có thể trả lại .delete trong chức năng E EditStyleForRowAt để bạn vẫn có thể xóa trong chế độ chỉnh sửa.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

2

Về cơ bản, bạn bật hoặc tắt chỉnh sửa bằng các phương pháp

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

Nếu tính năng chỉnh sửa được bật, biểu tượng xóa màu đỏ sẽ xuất hiện và người dùng yêu cầu cấu hình xóa. Nếu người dùng xác nhận, phương pháp ủy quyền

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

được thông báo về yêu cầu xóa. Nếu bạn triển khai phương pháp này, thì thao tác vuốt để xóa sẽ tự động được kích hoạt. Nếu bạn không triển khai phương pháp này, thì thao tác vuốt để xóa sẽ không hoạt động, tuy nhiên bạn không thể thực sự xóa hàng. Do đó, theo hiểu biết của tôi, bạn không thể đạt được những gì bạn yêu cầu, trừ khi sử dụng một số API riêng tư, không có giấy tờ. Có thể đây là cách ứng dụng Apple được thực hiện.


1
Tôi đã giải quyết điều này bằng cách trả lại UITableViewCellE Chỉnh sửaStyleDelete trong tableView: editStyleForRowAtIndexPath: nếu nó ở chế độ chỉnh sửa.
willi

0

Trên C #:

Tôi đã gặp vấn đề tương tự khi cần bật / tắt các hàng có tùy chọn Xóa khi vuốt. Nhiều hàng cần được vuốt sang trái và bị xóa, hãy giữ chúng ở màu khác. Tôi đã đạt được bằng cách sử dụng logic này.

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

Lưu ý rằng deleteIndexes là danh sách các chỉ mục bị xóa khỏi bảng mà không có bản sao. Mã này kiểm tra xem một hàng có bị xóa hay không, sau đó nó vô hiệu hóa thao tác vuốt hoặc ngược lại.

Chức năng đại biểu tương đương là Swift là canEditRowAtIndexPath.


0

Tôi cũng đã gặp sự cố này và đã khắc phục bằng các mã bên dưới. hy vọng nó sẽ giúp bạn.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.