Как обновить за presentModalViewController при использовании UIModalTransitionStylePartialCurl? - PullRequest
3 голосов
/ 31 августа 2011

Как сделать обновление свернутого вида живым, когда пользователь взаимодействует с представлением, представленным с presentModalViewController: под ним?

Поведение, которое я хочу:

  1. Пользовательнажимает кнопку настроек просмотра.
  2. Пользователь нажимает элементы управления на экране настроек просмотра.Вместо того, чтобы отклонять настройки вида, вид автоматически обновляется в фоновом режиме.
  3. Пользователь нажимает что-то, чтобы отклонить настройки вида.

Представьте, что в Картах не нажимается Карта, Спутник, Гибрид неРазвернуть автоматически, но только что обновил дисплей.

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

Это происходит как на устройстве, так и на симуляторе.

1 Ответ

1 голос
/ 26 февраля 2014

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

Если операторы, которые обновляют ваше представление представления (или представленное представление), выполняются в очереди отправки, отличной от основной очереди, UIKit может привести к противоречивым результатам и времени в фактическом обновлении пользовательского интерфейса. Обычно это можно определить, установив точку останова в операторах, которые обновляют пользовательский интерфейс, и изучив имя «очереди», отображаемой в виде отладчика Xcode слева. Это должен быть com.apple.main-thread. Если это не так, это может быть вашей проблемой. Это может происходить в нескольких методах делегатов, таких как сетевые API.

Попробуйте обернуть обновления вашего интерфейса в: dispatch_async (dispatch_get_main_queue (), ^ () {...}); и посмотрите, поможет ли это! Вы должны делать это только тогда, когда это необходимо, и позаботиться о том, чтобы использовать безопасные для блоков методы, как всегда.

Я протестировал это в совершенно новом Универсальном приложении для iOS 7.0.3, используя симулятор iPad с контроллером представления, представленным с использованием частичного перехода скручивания. Мне удалось воспроизвести исходную проблему, включая прерывистое обновление и обновление «оснастки» при отклонении представленного представления, используя фоновую очередь в коде, который я предоставил выше. Как только я переключился на основную очередь, все заработало. Хорошо.

Дайте мне знать, если это поможет или была какая-то другая проблема:)

...