Як увімкнути проведення пальцем, щоб видалити комірку в TableView?


75

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

Як мені це робити.

Я дав пусту реалізацію commitEditingStyle методу, а також встановив для властивості редагування значення YES.

Досі функція проведення пальцем не з’являється.

Тепер мені потрібно окремо додавати UISwipeGesture до кожної комірки?

Або мені чогось не вистачає?


Перейдіть за посиланням, це може вам допомогти, stackoverflow.com/questions/3309484/…
Sharme

2
Я перевизначив commitEditingStyle і встановив "Редагування" на "ТАК", а також ЗАРАЗ, я також перевизначив CanEditRowAtIndexPath. Звичайні елементи керування редагуванням з’являються, після натискання кнопки видалення. Але не при проведенні! Це тому, що Мій клас є підкласом UIViewController і реалізує лише методи делегування та джерела даних, але не UITableViewController, який, можливо, робить щось, щоб увімкнути жест проведення пальцем.
Amogh Talpallikar

Я просто встановив UITableView як IBOutlet у UIViewController вчора, і слідуючи точно тому ж посту, який я показав, я проведу пальцем, щоб видалити. Тож я можу сказати, що вам не потрібно активувати жестикулювання, хоча якщо ви дійсно не можете змусити його працювати іншим чином, можливо, вам доведеться вдатися до цього.
gurooj

До речі, проблема була вирішена, я фактично перевизначив editingStyleForRowAtIndexPath, і він повертав None, коли таблиця не була в режимі редагування, і ось в чому проблема. Я додав цей метод для чогось, що робив раніше, але забув видалити його, коли вимога змінилася.
Amogh Talpallikar

Відповіді:


55

Не потрібно встановлювати, editing:YESчи потрібно показувати кнопку Видалити при проведенні комірки. Вам потрібно реалізувати tableView:canEditRowAtIndexPath:та повернути ТАК для рядків, які потрібно редагувати / видаляти. Це не потрібно, коли dataSource вашого tableView є підкласом UITableViewContoller - цей метод, якщо його не замінено, за замовчуванням повертає YES. У всіх інших випадках вам доведеться це реалізувати.

EDIT: Разом ми знайшли проблему - tableView:editingStyleForRowAtIndexPath:повертається, UITableViewCellEditingStyleNoneякщо таблиця не була в режимі редагування.


Ви видалили [tableView setEditing:YES];?
Kyr Dunenkoff

Якщо я його видалю, основна кнопка видалення взагалі не з’являється!
Amogh Talpallikar

3
Якщо ви не видалите його, ви переведете свою таблицю в стан редагування, коли свайпи не працюють. Це або кругла червона кнопка мінус зліва, або проведіть пальцем, а не разом.
Kyr Dunenkoff

1
тепер я видалив оператор setEditing, але при проведенні пальцем нічого не відбувається. Це тому, що я використовую UIViewController, а не TabelViewController, який за замовчуванням може додавати жести проведення в кожну клітинку.
Amogh Talpallikar

5
Хочу додати, що tableView:canEditRowAtIndexPath:може бути недостатньо. Вам також доведеться реалізувати tableView:commitEditingStyle:forRowAtIndexPath.
Ден Ловенгерц,

61

Як зазначав Ден вище, вам потрібно реалізувати такі методи делегування подання таблиці:

  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.");
}

3
Я щойно перевірив це в iOS 8.1.2 на iPhone 6, і воно працює. Мені потрібно було лише реалізувати - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPathметод, оскільки редагування за замовчуванням має бути ТАК.
Крамер

25
// 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
    }   
}

6
Заслуговує на увагу / коментар для таких початківців, як я: рядок все ще потрібно видалити, а також зменшити джерело даних (наприклад, масив).
BananaAcid

12

Будь ласка, спробуйте цей код швидко,

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

5

Спробуйте додати до свого класу наступне:

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}

5
у мене не працює :( Це тому, що мій клас є підкласом UIViewController, і мені потрібно зробити щось додаткове, що робить UITabelViewController?
Amogh Talpallikar

1
@AmoghTalpallikar, Як ти вирішив свою проблему? Не могли б ви опублікувати своє рішення? У мене теж таке ж питання. Також мій клас - це підклас UIViewController, а всі комірки мого tableView - це підклас UITableViewCell.
Шамсіддін,

3

Висновок чату Кира Дуненкова

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

}

не слід визначати, якщо вам потрібна кнопка видалення, яка з’явиться при проведенні пальцем.


1

Якщо ви використовуєте 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)")
        }
    }
    

0

Це швидка версія

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

0

Це було проблемою і для мене ... Проводити пальцем, щоб видалити, можна було лише раз на 10 або близько того. Виявляється, gestureувімкнення телевізора було заблоковано іншим жестом у батьківському контролері перегляду. Телевізор був вкладений у MMDrawerController(макет шухляди, що дозволяє проводити пальцем).

Просто налаштування розпізнавача жестів у контролері шухляди не реагувати на близькі жести у флангових шухлядах дозволило проведіть пальцем, щоб видалити, щоб працювати на моєму телевізорі.

Ви також можете спробувати зробити щось подібне за допомогою gesture delegate:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

Я знаю, що це старе, але у мене така сама проблема з MMDrawerController .. Не могли б Ви детальніше розповісти про "налаштування розпізнавача жестів у контролері шухляди, щоб не реагувати на близькі жести у флангових шухлядах, дозволивши проведіть пальцем, щоб видалити, щоб працювати в моєму Телевізор ". Як ти це робиш?
Позначте

0

З мого досвіду, здається , що ви повинні мати editingна UITableViewсет NOдля зчитування на роботу.

self.tableView.editing = NO;


0

Після iOS 8.0 ви можете налаштувати дії в

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

-1
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];
    }
}

-2

Ви можете побачити всі необхідні методи, створивши клас (тимчасовий) UITableViewController в XCode 5, а потім скопіюйте, який метод ви хочете використовувати. Ці методи, які вам потрібні, будуть прокоментовані заздалегідь заповненими рядками, які ви бажаєте.


1
Ну, ця відповідь для інших людей, які шукають відповідь, точно. :)
Емін Бугра Сарал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.