Сбой UIPickerView при завершении прокрутки, но представление выбора уже освобождено - PullRequest
2 голосов
/ 25 июля 2011

У меня небольшая проблема с UIPickerView. Он является частью класса, который отображается как SemiModalViewController, который может быть отклонен (и освобожден) в любое время нажатием кнопки OK. Этот класс также реализует функции делегата UIPickerView для принятия любых изменений выбора и т. Д.

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

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

Ответы [ 3 ]

0 голосов
/ 25 июля 2011

Хорошо, я разработал решение ...

На самом деле все, что я хочу сделать, - это убедиться, что средство выбора не пытается отправить событие Selection Changed несуществующему родительскому классу. В случае прокрутки сборщика, это также может означать просто сброс любого конечного значения, которого он мог достичь.

К сожалению, UIDatePicker и UIPickerView также сильно отличаются друг от друга, поэтому решение оказалось немного сложнее, чем я думал.

Для тех, кому интересно:

Я создал одноэлементный класс, который отслеживает все средства выбора, которые я создаю. Этот одноэлементный класс также служит делегатом для всех обратных вызовов Picker - так что все средства выбора всегда будут вызывать их. Конечно, если родительский класс больше не существует, результат будет отброшен.

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

Некоторое усилие, но теперь оно работает как шарм. Больше никаких сбоев и определенного поведения во всех случаях: -).

0 голосов
/ 10 июля 2013

У меня была похожая проблема, и я решил ее, добавив

picker.delegate = nil;

непосредственно перед тем, как закрыть родительский контроллер представления.Я считаю, что отправка сообщения на ноль - это нормально и прекрасно.

Однако это может привести к переключению представлений в окне выбора на «?»этикетки на мгновение.

0 голосов
/ 25 июля 2011

Я не думаю, что есть метод, чтобы проверить, анимирует ли thUIPicker, но вы можете сделать небольшую проверку в методе, который закрывает модальное представление.Проверьте текущий индекс выбора, подождите 0,5 секунды и проверьте снова.Если вы преследуете, вы знаете, что он все еще прокручивается.

...