iOS - Отключить выбор строки во время обработки метода

78
10

Хорошо, это мой первый вопрос, так что будьте осторожны!

У меня есть UITableView в iOS (мы разрабатываем с использованием Xamarin С#), где выбор строки будет десериализовать представление, поступающее с сервера, перед его отображением. Это отлично работает на моем iPad mini Retina без проблем и на симуляторе. Тем не менее, пользователи с iPad 3 или ниже имеют огромную задержку, ожидая, что десериализатор завершит свою работу. Мы оптимизировали его как можно лучше, но у нас все еще есть задержка.

Эта задержка позволяет пользователям нажимать на строку несколько раз (думая, что она ничего не делает), что заставляет обрабатывать несколько раз, а затем несколько экземпляров десериализованного представления появляться в стеке, что приводит к сбою навигации и приложению, когда пытаясь перейти обратно в стек.

Мой вопрос в том, есть ли способ остановить события щелчка по строке, которые обрабатываются для этой конкретной строки после первого нажатия, пока мы не переместимся обратно на этот контроллер? Я попытался использовать WillSelectRow и переменную класса bool (быстрый пример ниже)

bool isProcessing = false;
public override NSIndexPath WillSelectRow (UITableView tableView, NSIndexPath indexPath)
{
if(!isProcessing)
return indexPath;
return null;
}

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
isProcessing = true;

var data = GetDataAt(indexPath);

ProcessRowSelection(tableView, indexPath, data);

isProcessing = false;

}

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

Любые идеи были бы любезно оценены!

спросил(а) 2021-01-25T19:55:37+03:00 5 месяцев назад
1
Решение
126

Я думаю, что использование переменной класса кажется хорошим вариантом в этом случае.

В методе, который вызвал выбор ячейки, вы можете использовать условное выражение для указания того, следует ли десериализовать представление. Если isProcessing == NO, установите isProcessing в YES и десериализуйте представление; в противном случае не десериализуйте представление. Затем, как только представление будет выполнено десериализацией, установите isProcessing в NO.

Другим хорошим вариантом было бы установить свойство ячейки или даже всей таблицы userInteractionEnabled в NO затем повторно активировать взаимодействие после того, как представление будет выполнено десериализация.

ответил(а) 2021-01-25T19:55:37+03:00 5 месяцев назад
45

Я считаю, что вам нужно переместить эту логику в метод rowSelected:

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
if(!isProcessing)
{
isProcessing = true;
var data = GetDataAt(indexPath);
ProcessRowSelection(tableView, indexPath, data);
}
else
{
isProcessing = false;
}
}

ответил(а) 2021-01-25T19:55:37+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема