2012-01-24 1 views
72

У меня есть UIViewController, который реализует протоколы делегатов таблиц и источники данных. Теперь я хочу добавить «салфетки для удаления» жестов в ячейки.Как включить прокрутку для удаления ячейки в TableView?

Как мне это сделать?

Я дал пустую реализацию метода commitEditingStyle, а также установил для свойства «Редактирование» значение «ДА».

Тем не менее функция салфетки не подходит.

Теперь нужно отдельно добавить UISwipeGesture в каждую ячейку?

Или я что-то упускаю?

+0

см ссылка, он может помочь вам, http://stackoverflow.com/questions/3309484/uitableviewcell- show-delete-button-on-swipe – Sharme

+2

Я переопределил commitEditingStyle и установил Редактирование на YES, а также СЕЙЧАС Я также переопределил CanEditRowAtIndexPath. Элементы управления «Нормальное редактирование» появляются при нажатии кнопки удаления. Но не на чистке! Является ли это потому, что мой класс является подклассом UIViewController и реализует только методы делегирования и источника данных, но не UITableViewController, которые могли бы сделать что-то, чтобы включить жестов салфетки. –

+0

Я только что настроил UITableView как IBOutlet в UIViewController вчера, и, следуя точно так же, как этот пост, который я показал, я ударил, чтобы удалить. Поэтому я могу сказать, что вам не нужно включать жестовые салфетки, хотя, если вы действительно не можете заставить его работать каким-либо другим способом, вам, возможно, придется прибегнуть к этому. – gurooj

ответ

51

Если вам нужно показать кнопку «Удалить» на прокрутке ячейки, вам не нужно устанавливать editing:YES. Вы должны реализовать tableView:canEditRowAtIndexPath: и возвращать ДА оттуда для строк, которые нужно отредактировать/удалить. Это необязательно, если dataSource tableView является подклассом UITableViewContoller - этот метод, если не переопределенный, возвращает YES по умолчанию. Во всех остальных случаях вы должны его реализовать.

EDIT: Вместе мы нашли проблему - tableView:editingStyleForRowAtIndexPath: вернулся UITableViewCellEditingStyleNone, если таблица не была в режиме редактирования.

+1

Выполнено все, но все еще не работает! –

+0

Вы удалили '[tableView setEditing: YES];'? –

+0

Если я удалю его, основная кнопка удаления не будет вообще! –

5

Попробуйте добавить следующую строку в ваш класс:

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

не работает для меня :( Это потому, что мой класс является подклассом UIViewController, и мне нужно сделать что-то дополнительное, что делает UITabelViewController? –

+1

@AmoghTalpallikar, как вы решили свою проблему? Могли бы вы опубликовать свое решение? У меня также есть такая же проблема. Также мой класс является подклассом UIViewController, и все ячейки моего табличного элемента являются подклассом UITableViewCell. – Shamsiddin

3

Заключение Kyr Dunenkoff чат

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

} 

не должен быть определен, если вам нужно кнопка, чтобы появиться на взмахе удалить.

59

Как Dan прокомментировал выше, вы должны реализовать следующий вид таблицы методы делегата:

  1. tableView:canEditRowAtIndexPath:
  2. tableView:commitEditingStyle:forRowAtIndexPath:

Примечание: Я попробовал это в IOS 6 и прошивкой 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."); 
} 
+2

будет работать с ios 8 – iOSDeveloper

+0

, он фактически не работает на ios8 – Reaper

+3

Я только что протестировал это в iOS 8.1.2 на iPhone 6, и он работает. Мне нужно было только реализовать таблицу tableView: (UITableView *) таблицыView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editStyle forRowAtIndexPath: (NSIndexPath *) метод indexPath' в качестве редактирования должен быть YES по умолчанию. – neonhomer

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 
    } 
} 
+5

Примечание/комментарий для новичков вроде меня: t он все равно должен быть удален, а также источник данных (например, массив) необходимо уменьшить. – BananaAcid

-2

Вы можете увидеть все необходимые методы, создав в XCode 5 класс UITableViewController (временный), а затем скопируйте тот метод, который вы хотели бы использовать. Те методы, которые вам нужны, будут прокомментированы с заранее заполненными строками, которые вы хотите.

+1

Ну, этот ответ для других людей, которые ищут ответ, наверняка. :) –

0

Это была проблема для меня тоже ... Я мог только прокручивать, чтобы удалить, чтобы работать каждые 10 или около того попыток. Оказывается, gesture на телевизоре блокировался другим жестом в контроллере родительского представления. Телевизор был вложен в MMDrawerController (макет ящика для проводов).

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

Вы также можете попробовать сделать что-то подобное с gesture delegate:

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

Я знаю, что это старо, но у меня такая же проблема с MMDrawerController. Не могли бы вы подробнее остановиться на «настройке распознавателя жестов в контроллере ящика, чтобы не реагировать на тесные жесты во фланговых ящиках, разрешенных для удаления, чтобы удалить работать на моем телевизоре ». Как ты это делаешь? – Mark

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

Пожалуйста, попробуйте этот код в быстры,

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

Если вы используете NSFetchedResultsControllerDelegate для заполнения вида таблицы, это работает для меня:

  • Убедитесь, что tableView:canEditRowAtIndexPath возвращает истинный всегда
  • В вашем 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

По моему опыту, кажется, что вы должны иметь editing на UITableView набор для NO для считывания работать.

self.tableView.editing = NO;

0

После прошивки 8.0, вы можете пользовательским вы в действии

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath 
Смежные вопросы