#ios #pageviews
#iOS #просмотры страниц
Вопрос:
Я создаю приложение для показа книги с помощью UIPageViewController
(чтобы анимация поворота страницы по умолчанию была очень приятной) Я сохраняю все данные, относящиеся к каждой странице, в виде основных данных. В моем MyModelController.m
файле, используя метод init, я извлекаю все данные и инициализирую pageData
массив. Но книга, которую я собираюсь показать, огромная. Итак, есть ли какой-нибудь способ сделать что-то подобное dequeueReusableCellWithIdentifier
, чтобы в память загружались только требуемые страницы?
Пожалуйста, поправьте меня, если мои ожидания неверны.
Ответ №1:
Установите начальный контроллер представления с помощью UIPageViewController
-setViewControllers:direction:animated:completion:
Затем реализуйте следующие методы UIPageViewControllerDataSource:
– pageViewController:viewControllerBeforeViewController:
– pageViewController:viewControllerAfterViewController:
Эти методы позволяют вам предоставлять UIPageViewController контроллеры представления до и после текущего контроллера представления.
Таким образом, вы сохраняете в памяти только один контроллер представления (и соответствующие данные модели). Я уверен, что он выполняет некоторое кэширование за кулисами, но если это так, оно будет освобождено при срабатывании предупреждения о нехватке памяти.
Вместо того, чтобы загружать всю вашу модель данных в один массив, загружайте только необходимые объекты для текущего контроллера представления по требованию постранично внутри вашего контроллера представления, представляющего одну страницу, или внутри двух методов источника данных, упомянутых выше.
Если вы создадите новый проект на основе UIPageViewController в Xcode 4.2, вы увидите, что шаблон по умолчанию содержит код, демонстрирующий это.
Комментарии:
1. Вы правы в отношении способа создания контроллера представления. Но я думаю, что ios не будет кэшироваться сама по себе. Если вам нужен кеш, то вам нужно реализовать его самостоятельно.
Ответ №2:
Поправьте меня, если я ошибаюсь, но я считаю UIPageViewController
, что по умолчанию в память загружаются только следующая и предыдущая страницы, поэтому вам не нужно беспокоиться об управлении памятью.
Ответ №3:
Не уверен, я понимаю ваш вопрос, но похоже, вы не хотите, чтобы все содержимое вашей книги загружалось как объекты страницы. Вместо загрузки всего содержимого книги в вашем методе инициализации загружайте только отображаемую страницу, затем, когда пользователь «переворачивает» страницу, загружайте следующую или предыдущую страницу на основе отображаемой в данный момент страницы.
Комментарии:
1. Вы правы. Я понимаю вашу точку зрения и добиваюсь ее вручную. Но в случае представления таблицы iOS обрабатывает их. Я ищу какую-то такую вещь, где она может обрабатываться iOS вместо разработчика.
2. iOS на самом деле мало что обрабатывает в dequeResuableCellWithIdentifer, кроме сохранения пары ячеек и возврата их при запросе. Разработчику все равно приходится настраивать эту ячейку со своими данными каждый раз, когда tableview хочет ее отобразить, что означает, что данные либо уже находятся в памяти в TableViewController, либо разработчик загружает их по мере необходимости, когда TableView запрашивает новую ячейку. Это та же проблема, которую вы пытаетесь решить. Я не вижу способа сделать это вручную.
Ответ №4:
Если вы используете книгу в формате PDF, вы можете загрузить нужную страницу и перейти к контроллеру представления только при вызове этих двух методов
– pageViewController:viewControllerBeforeViewController:
– pageViewController:viewControllerAfterViewController: