UITableView вимикає проведення пальцем, щоб видалити, але видалення все одно залишається в режимі редагування?


91

Я хочу щось подібне до програми "Сигналізація", де ви не можете провести пальцем, щоб видалити рядок, але ви все одно можете видалити рядок у режимі редагування.

Коли ви коментували tableView: commitEditingStyle: forRowAtIndexPath :, я вимкнув проведення, щоб видалити, і все ще мав кнопку Видалити в режимі редагування, але що відбувається, коли я натискаю кнопку Видалити. Що називається?

Відповіді:


286

Гаразд, це виявляється досить легко. Це те, що я зробив, щоб вирішити це:

Завдання-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, потім проведіть пальцем, щоб видалити, знову вмикається автоматично. Чи ні?
Массімо Кафаро,

Ні, проведіть пальцем, щоб видалити, не ввімкнено, якщо воно не перебуває в режимі редагування. Ось чому я повертаю UITableViewCellEditingStyleNone за замовчуванням.
willi

3
Забув згадати, що вам потрібно якщо (editingStyle == UITableViewCellEditingStyleDelete) у комітетіEditingStyle:
willi

Добре, з цим твердженням ви отримали дію видалення, але вона має іншу візуальність. Чи є шанс здійснити цю дію з такою ж візуальністю версії, що проводить пальцем?
Göktuğ Aral

@giuseppe Це не має значення. Він не помиляється, повертаючись до себе. Цей метод делегата посилається назад на той самий tableView, тому він може використовувати або або.
Стівен Пол,

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.

Ви можете повернути .delete у функції 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: editingStyleForRowAtIndexPath: якщо він знаходиться в режимі редагування.
Вільлі

0

На C #:

У мене була та сама проблема, коли це було потрібно для ввімкнення / вимкнення рядків з опцією Видалити при проведенні пальцем. Кілька рядків потрібно було провести пальцем ліворуч і видалити, щоб вони були в іншому кольорі. Я досяг цього, використовуючи цю логіку.

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

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

}

Зверніть увагу, що deleteIndexes - це список індексів, які видаляються з таблиці без дублікатів. Цей код перевіряє, чи рядок видаляється, а потім вимикає гортання або навпаки.

Еквівалентною функцією делегата є Swift is 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
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.