Пользовательский UIView из Interface Builder - PullRequest
11 голосов
/ 02 февраля 2011

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

Я знаю, как его создать программно - вы создаете UIView подкласс, реализуете метод drawRect, помещаете пустой UIView в Interface Builder и, вероятно, это Class для моего пользовательского класса.Моя проблема в том, что я хочу создать эти пользовательские представления в Интерфейсном Разработчике вместо этого программно .

До сих пор я создал контроллер UIViewController с файлом XIB и вviewDidLoad метод контроллера представления из шаблона Я создаю этот экземпляр настраиваемого контроллера представления и добавляю его представление как подпредставление пустого UIView, добавленного в Интерфейсном Разработчике (то же самое, что вы изменили бы Класс в программном подходе).1021 * Это работает, но для меня это скорее хак, и мне трудно поверить, что нет лучшего способа, где я мог бы добавить эти пользовательские представления в построителе интерфейса без необходимости реализации метода viewDidLoad и создания контроллеров идобавить свои взгляды внутри этого метода.

Ответы [ 4 ]

1 голос
/ 30 июля 2011

Первоначально это был комментарий в ветке Ратиньо, но он стал слишком большим.

Хотя мой собственный опыт совпадает со всем, что упомянуто здесь и выше, есть некоторые вещи, которые могут облегчить вашу боль или, по крайней мере, заставить вещи чувствовать себя немного менее взломанными.

Получите все ваши пользовательские классы UIView из общего класса, скажем, EmbeddableView. Оберните всю логику initWithCoder в этом базовом классе, используя идентификатор класса (или перегружаемый метод), чтобы определить NIB для инициализации. Это все еще хак, но вы хотя бы формализуете правила интерфейса и скрываете механизм.

Кроме того, вы можете еще больше улучшить интерфейс Interface Builder, используя классы «micro controller», которые соединяются с вашими пользовательскими представлениями для обработки их методов делегирования / действия и устранения разрыва с основным UIViewController через собственный протокол делегирования. Все это можно соединить вместе, используя соединители в Интерфейсном Разработчике.

Базовому UIViewController нужно только реализовать достаточно функциональности, чтобы соответствовать шаблону делегирования "микроконтроллера".

У вас уже есть детали для добавления пользовательских представлений путем изменения имени класса и обработки загрузки пера. «Микроконтроллеры» (если используются) могут быть просто производными NSObject классами , добавляемыми в NIB, как предлагается здесь .

Несмотря на то, что я проделал все эти шаги в единичных случаях, я никогда не проходил все это до такого рода формального решения, но при некотором планировании оно должно быть достаточно надежным и надежным.

1 голос
/ 29 марта 2011

Чтобы это работало, вы должны создать плагин для Interface Builder, который использует класс вашего пользовательского элемента управления.Как только вы создадите и установите свой плагин, вы сможете добавлять и перетаскивать экземпляры своего представления в другое окно или представление в Интерфейсном Разработчике.Чтобы узнать о создании плагинов IB, см. Руководство по программированию плагинов Interface Builder *1002* и главу по созданию собственных элементов управления IB Palette из книги Аарона Хиллегаса, Программирование какао для Mac OS X .

Здесь - ссылка на первоначального автора принятого ответа на аналогичный вопрос .

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

К сожалению, вы не можете делать то, что хотите делать с UIKit. Плагины IB работают только для OS X, и Apple явно не позволяет использовать их для разработки под iOS. Что-то с ними делать, не будучи статичными библиотеками. Кто знает, они могут когда-нибудь изменить это, но я не задерживаю дыхание.

0 голосов
/ 02 февраля 2011

Может я тебя не понял?
у вас есть библиотека в Интерфейсном Разработчике, вы можете перемещать любой компонент и размещать его в своем представлении. (Вы можете добавить другое представление, добавив UIView и изменив имя его класса на 4-й вкладке).
затем вы объявляете переменные с IBOutlet и подключаете их со 2-й вкладки владельцев вашего файла к их компонентам ... другой вопрос?

...