UIScrollview для отображения пользовательского UIView, состоящего из основных атрибутов данных: логика для разработки этого?
Не могли бы вы сказать мне, если моя логика звучит правильно? Потому что я все еще очень плохо знаком с iOS (продолжительностью около недели) и буду очень признателен за ваши отзывы, прежде чем отправиться в неправильном направлении.
У меня есть основные настройки данных с фотографией лица. И то, что я пытаюсь сделать, это создать объект типа "заметка" в моем UIScrollView. На карточке заметки будет UILabel вверху, за которым следует UIImage в середине и две кнопки UIB под изображением (т. Е. Кнопки будут "отправить" или "отменить"). Моя цель состоит в том, чтобы эти объекты в виде заметок можно было прокручивать, например, картинки, в том числе на странице.
По большей части я думаю, что я позаботился о частях ScrollView и Page Turner. Мне просто непонятно, как лучше всего создать объекты карты заметок.
Должен ли я просто создать подкласс UIView, а затем программно создать экземпляры карты заметок или есть способ создать файл XIB для UIView, чтобы я мог создавать IBOutlets из класса в представление? Потому что, если последнее возможно, я бы хотел сделать это, но не знаю, как заставить файл XIB принимать выходы из объекта UIView, в отличие от UIViewController.
За пределами пользовательского UIView мне все еще неясно, как мне следует подходить к запросам этих объектов из основной базы данных, чтобы при загрузке окна "ожидающие решения" у меня были прокручиваемые объекты для принятия решения.
В моем классе UIScrollViewController, под viewDidLoad, не могли бы вы сказать мне, если мне нужно использовать цикл For Loop, состоящий из FetchRequests, вместе с кодом, который затем выделяет inits и устанавливает мои переменные UIView с использованием атрибутов основных данных? Потому что я просто не уверен, правильно ли это звучит и есть ли лучшая альтернатива.
1 ответ
Вы можете создать пользовательский класс-потомок XIB и UIViewController, как и любой другой вид, и повторно использовать его в своем представлении прокрутки. Это избавляет вас от разметки подпредставлений вручную и позволяет инкапсулировать любую логику вокруг строк форматирования для отображения. Используя этот подход, пользовательский вид карты заметок будет работать автономно или как подпредставление в чем-то другом (например, в виде прокрутки) и обеспечивать согласованный интерфейс для пользователя.
Вы можете подключить выходы в представлении к любому объекту, который вам нужен - если это не производный класс UIViewController, его можно назвать в XIB как прокси-объект. Вы устанавливаете класс прокси на свой пользовательский класс и подключаете розетки как обычно. Однако при создании представления это становится немного странным, так как вам нужно передать экземпляр этого пользовательского класса (Proxy, который вы определили в XIB) в метод NSBundle loadNibNamed из словаря опций. Это работает, но я обычно использую ранее упомянутое решение, поскольку оно позволяет представлению работать независимо независимо от дополнительного кода.
В обоих решениях у меня есть назначенный инициализатор для представления, который принимает сущность в качестве параметра, чтобы представление могло настраивать себя, а также свойство, которое можно использовать для изменения сущности после визуализации представления (установщик для свойство заставляет представление обновляться и анимироваться при его изменении)
В любом случае в текущем SDK (< 5) подпредставления не будут участвовать в обычном жизненном цикле представления (viewDidLoad, viewDidUnload и т. Д.). Только основные контроллеры представления (отображаемые с использованием push/popViewController, presentModalViewController) имеют эти методы, вызываемые, поэтому, если у ваших подпредставлений есть код, который выполняется в одном из этих методов жизненного цикла (и они, вероятно, будут), вам придется создать свой собственный. слесарное дело, чтобы уведомить подпредставления о том, что происходит. Так как SDK 5 все еще находится под NDA, я не могу сказать, что там отличается, но я могу сказать, что если ваше приложение может ждать 5, ваша жизнь будет намного проще. Посмотрите, что нового в 5, и вы поймете, о чем я говорю.
Что касается загрузки данных, трудно рекомендовать лучший метод, не зная больше о том, как ваше приложение загружает информацию, сколько записей отображается за раз и т. Д. В общем, вы должны делать как можно меньше запросов на выборку, не загружая больше данных, чем будет отображаться немедленно. В своих проектах я обычно:
- Создайте один запрос FetchRequest для каждого вида
- Установите batchSize запроса на выборку в 2,5 раза больше размера экрана (произвольное значение, которое мне хорошо сработало)
- Я всегда создаю собственные NSManagedObjects (бесстыдный плагин) для своих сущностей. Это облегчает работу с сущностью, поскольку обеспечивает автозаполнение имен свойств, и на самом деле более производительно, чем getValueForKey: (согласно Apple)
- Если у сущностей много данных в каждой, я поэкспериментирую с setReturnsObjectsAsFaults, чтобы увидеть, помогает ли задержка загрузки тяжелых данных памяти больше, чем производительность
- Если мне нужны только пара свойств каждой сущности, я реорганизую свои сущности так, чтобы была сущность "заголовка" с только теми свойствами, которые мне нужны в представлении списка, и "полная" сущность со всеми данными (упомянутыми в заголовок, чтобы облегчить загрузку для подробного просмотра)
- Если мне нужно только одно свойство от каждой сущности, например, чтобы получить список уникальных дат встреч, на которые назначаются встречи для отображения индикатора в календаре, я использую propertiesToFetch в сочетании с NSDictionaryResultsType, чтобы вернуть только массив этих значений