UITableView ปิดใช้งานการปัดเพื่อลบ แต่ยังคงมีการลบในโหมดแก้ไขหรือไม่


91

ฉันต้องการบางอย่างที่คล้ายกับแอพ Alarm ซึ่งคุณไม่สามารถปัดลบแถวได้ แต่คุณยังลบแถวในโหมดแก้ไขได้

เมื่อแสดงความคิดเห็นออก tableView: คอมมิตEditingStyle: forRowAtIndexPath: ฉันปิดการใช้งานการปัดเพื่อลบและยังคงมีปุ่ม Delete ในโหมดแก้ไข แต่จะเกิดอะไรขึ้นเมื่อฉันกดปุ่ม Delete เรียกว่าอะไร?

คำตอบ:


287

โอเคมันกลายเป็นเรื่องง่ายมาก นี่คือสิ่งที่ฉันทำเพื่อแก้ปัญหานี้:

วัตถุประสงค์ -C

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

    return UITableViewCellEditingStyleNone;
}

สวิฟต์ 2

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

    return .None
}

สวิฟต์ 3

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

    return .none
}

คุณยังต้องดำเนินการtableView:commitEditingStyle:forRowAtIndexPath:เพื่อยืนยันการลบ


bu แล้วปัดเพื่อลบจะเปิดใช้งานโดยอัตโนมัติอีกครั้ง หรือไม่?
Massimo Cafaro

ไม่ไม่ได้เปิดใช้งานการปัดเพื่อลบหากไม่ได้อยู่ในโหมดแก้ไข นั่นเป็นเหตุผลที่ฉันคืนค่า UITableViewCellEditingStyleNone เป็นค่าเริ่มต้น
willi

3
ลืมบอกไปว่าคุณต้องการ if (editStyle == UITableViewCellEditingStyleDelete) ใน CommitEditingStyle:
willi

ตกลงด้วยคำสั่งนี้คุณได้ลบการกระทำ แต่มีภาพที่แตกต่างกัน มีโอกาสที่จะมีการกระทำที่มีภาพเหมือนของรุ่นรูดหรือไม่?
Göktuğ Aral

@giuseppe ไม่เป็นไร เขาไม่ผิดโดยอ้างถึงตัวตน วิธีการมอบสิทธิ์นั้นอ้างถึงกลับไปที่ tableView เดียวกันดังนั้นเขาจึงใช้ได้อย่างใดอย่างหนึ่งหรือ
Stephen Paul

9

เพื่อทำให้สิ่งต่างๆชัดเจนการปัดเพื่อลบจะไม่ถูกเปิดใช้งานเว้นแต่tableView:commitEditingStyle:forRowAtIndexPath:จะมีการใช้งาน

ในขณะที่ฉันอยู่ระหว่างการพัฒนาฉันไม่ได้ใช้มันดังนั้นจึงไม่ได้เปิดใช้งานการปัดเพื่อลบ แน่นอนว่าในแอปที่สร้างเสร็จแล้วจะมีการใช้งานเสมอเพราะไม่เช่นนั้นจะไม่มีการแก้ไข


4

เวอร์ชัน Swift:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

คุณต้องใช้ฟังก์ชัน CanEditRowAt

คุณสามารถคืนค่า. ลบในฟังก์ชัน EditingStyleForRowAt เพื่อให้คุณยังคงสามารถลบในโหมดแก้ไขได้

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

โดยทั่วไปคุณเปิดหรือปิดการแก้ไขโดยใช้วิธีการ

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

หากเปิดใช้งานการแก้ไขไอคอนการลบสีแดงจะปรากฏขึ้นและรูปแบบการลบที่ร้องขอไปยังผู้ใช้ หากผู้ใช้ยืนยันวิธีการมอบสิทธิ์

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

ได้รับแจ้งคำขอลบ หากคุณใช้วิธีนี้การปัดเพื่อลบจะทำให้ทำงานโดยอัตโนมัติ หากคุณไม่ใช้วิธีนี้การปัดเพื่อลบจะไม่ทำงานอย่างไรก็ตามคุณไม่สามารถลบแถวได้จริง ดังนั้นจากความรู้ของฉันอย่างดีที่สุดคุณจะไม่สามารถบรรลุสิ่งที่คุณขอได้เว้นแต่จะใช้ API ส่วนตัวที่ไม่มีเอกสาร อาจเป็นวิธีการใช้งานแอปพลิเคชัน Apple


1
ฉันแก้ไขสิ่งนี้โดยส่งคืน UITableViewCellEditingStyleDelete ใน tableView: editStyleForRowAtIndexPath: หากอยู่ในโหมดแก้ไข
willi

0

ใน C #:

ฉันมีปัญหาเดียวกันกับที่จำเป็นในการเปิด / ปิดแถวด้วยตัวเลือกลบเมื่อปัด ต้องเลื่อนหลายแถวไปทางซ้ายและลบออกให้เป็นสีอื่น ฉันใช้ตรรกะนี้สำเร็จ

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

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

}

โปรดสังเกตว่า deleteIndexes คือรายการดัชนีที่ถูกลบออกจากตารางโดยไม่มีรายการซ้ำ รหัสนี้ตรวจสอบว่าแถวนั้นถูกลบหรือไม่จากนั้นจะปิดใช้งานการปัดหรือในทางกลับกัน

canEditRowAtIndexPathฟังก์ชั่นผู้รับมอบสิทธิ์เทียบเท่าเป็นสวิฟท์


0

ฉันเจอปัญหานี้และแก้ไขด้วยรหัสด้านล่าง หวังว่ามันจะช่วยคุณได้

- (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
}

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.