UITableView editActionsForRowAtIndexPath перестает работать, если вы возвращаете пустой массив
У меня есть UITableView, для которого я добавил некоторые пользовательские кнопки слайда. Все они работают так, как ожидалось. Однако в моей таблице есть сценарий, в котором строка может находиться в состоянии, когда ни одна из кнопок слайда не является релевантной, и поэтому я возвращаю пустой массив действий, поэтому кнопки слайда не отображаются. К сожалению, когда это происходит, UITableView перестает вызывать мой editActionsForRowAtIndexPath, эффективно отключая кнопки слайда для всех строк в моей таблице... и кажется постоянным до перезапуска приложения.
Является ли это ожидаемым поведением?
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
if mydata[indexPath.row].EditAvailable()
{
var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
return [editAction]
}
else
{
return []
}
}
Ответы
Ответ 1
Как я решил эту проблему, было реализовать функцию,
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
Здесь вы должны просто вернуть false, если вы не хотите, чтобы ожидаемая строка имела функцию прокрутки.
Таким образом, код будет выглядеть примерно так.
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return mydata[indexPath.row].EditAvailable()
}
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
return [editAction]
}
Теперь EditActionsForRowAtIndexPath вызывается только для тех, которые вы указали, редактируемыми.
Ответ 2
Попробуйте использовать tableView:editingStyleForRowAtIndexPath:
.
Вы можете управлять включением/выключением самого слайда.
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
if (/* mydata[indexPath.row].EditAvailable() */) {
return UITableViewCellEditingStyleDelete;
} else {
return UITableViewCellEditingStyleNone;
}
}
(я тестировал в objective-c)
Ответ 3
Избегайте пропускать пустые массивы при -
tableView editActionsForRowAtIndexPath
Лучше выполнить проверку состояния -
tableView canEditRowAtIndexPath
Отформатируйте свой код следующим образом:
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
if mydata[indexPath.row].EditAvailable() {
return true
}
return false
}
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
return [editAction]
}
Ответ 4
Во-первых, editActionsForRowAtIndexPath должен возвращать нуль, а не [], когда нет действий.
func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
if mydata[indexPath.row].EditAvailable()
{
var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
return [editAction]
}
else
{
return nil
}
}
Во-вторых, вы должны реализовать editStyleForRowAtIndexPath, чтобы отключить действие "Удалить" по умолчанию для других строк.
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
if mydata[indexPath.row].EditAvailable() {
return UITableViewCellEditingStyle.Delete
}
return UITableViewCellEditingStyle.None
}
Спасибо luciano за пустой кончик наконечника/ноль
Ответ 5
В iOS9.3 "canEditRowAtIndexPath" не работает!!!
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
Итак, для меня работает следующий код. Необходимо реализовать только два метода.
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
if(//not editable){
return nil;
}
return @[//your actions];
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if(//not editable){
return UITableViewCellEditingStyleNone;
}
return UITableViewCellEditingStyleDelete;
}
Ответ 6
Вы не должны возвращать пустой массив для действий в editActionsForRowAtIndexPath. Если вы хотите сделать строку недоступной для редактирования...
return false на canEditRowAtIndexPath. Как только вы вернете пустой массив, все строки перестанут показывать кнопки салфетки. Его странное поведение, я не знаю, является ли его сбой или как предполагалось.
Ответ 7
Я реализовал подобное выборочное использование действий для некоторого tableCell с использованием ob-c (не тестировалось в swift) некоторое время назад, но поставил селективность в handleSwipe, ниже у меня есть действие для всех, кроме последнего:
- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer{
CGPoint location = [gestureRecognizer locationInView:self.tableView];
NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:location];
if(!(swipedIndexPath.row<[coreDataHelper getAllTimerLists].count) ){
[self.tableView setEditing:!self.tableView.editing animated:YES];
}
}
Помогает ли это вам или вам нужно несколько разных массивов действий, в отличие от этого, у которых есть только один массив и инактивирует/активирует его?