Как лучше всего загрузить пользовательский UIView?

В своем приложении для iPhone я создал пользовательский интерфейс UIView, который использую в нескольких различных контроллерах представления для отображения некоторой информации.

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

У меня вопрос: как лучше всего загрузить это представление? Я пробовал просто разместить представление в контроллерах представления, которые я хочу, чтобы оно отображалось при использовании IB, но этого, похоже, недостаточно. Мне кажется, что если вы установите идентификатор класса для представления, оно должно загружать это представление при создании контроллера представления. Или, может быть, нет, потому что он не знает, из какого пера его взять (конечно, он находится в отдельном пике).

Поскольку это не контроллер представления, я не могу просто использовать initWithNibName. Я пробовал использовать NSBundle loadNibNamed, как и с ячейками таблицы, но это кажется ужасно большим объемом работы. Код выглядит так:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:nil options:nil];
for (id currentObject in topLevelObjects) {
    if ([currentObject isKindOfClass:[MyCustomView class]]) {
        self.customView = currentObject;
        break;
    }
}
[self.view addSubview:self.customView];

Должен быть более простой способ, не связанный с циклом. Кроме того, создание представления таким образом заставляет меня терять всю информацию из IB о том, где я на самом деле разместил представление. Он создается в точке 0,0, а это не там, где я хочу. Да, я знаю, что могу установить новый кадр, но, опять же, должен быть более простой способ. Есть ли способ сделать это через IB? Или, по крайней мере, с меньшей программной работой?


person Mike    schedule 08.10.2010    source источник


Ответы (2)


Я тоже так делаю. Я столкнулся с проблемой, что хочу создать подкласс UIView и одновременно использовать перо. Я не думаю, что есть лучший способ сделать это, потому что файл пера может содержать много объектов, и вы должны указать, какой из них использовать. Однако сделайте это таким образом, чтобы вы могли поместить IBOutlet в свой MyCustomView и привязать его к IB, чтобы представление могло управлять собой, например. переопределение layoutSubviews.

person tia    schedule 08.10.2010
comment
Что на самом деле здесь делает для меня IB? Мне нужно вручную загрузить представление из пера, а затем вручную установить рамку, чтобы это было правильное положение и размер, а затем добавить его в родительский вид. Я подключился к IB, используя объект UIView, который я вставил в конструктор, но действительно ли это необходимо? Что IB делает для меня здесь? - person Mike; 08.10.2010
comment
IB выполняет за вас всю структуру вложенного представления, включая настройки этих свойств и привязку IBOutlet и IBAction. Вы можете продолжать искать более легкий путь, которого, я думаю, нет. В любом случае, ваш фрагмент кода хорош, и если вы сделаете его методом, вам будет проще загрузить пользовательский UIView. - person tia; 08.10.2010

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

В ParentViewController создайте IBOutlet для UIView, который будет содержать ссылку на представление, содержащее ваш пользовательский наконечник. (Называется customView, опять же просто потому, что)

Теперь откройте перо (для обычно используемого customView) в Interface Builder и выберите владельца файла. Теперь на вкладке Identity выберите ParentViewController, созданный выше для класса. А теперь уловка. В Connections удалите любое соединение с «представлением» (если оно есть) и создайте соединение от выхода customView к самому верхнему UIView пера, определяющего ваш customView.

Теперь, когда вы выполняете loadNibNamed в коде для подкласса ParentViewController, он должен автоматически загружать UIView из вашего пера и помещать ссылку на него в розетку для использования вами. Петля не требуется.

Вы также можете добавить выходы для любых других компонентов интерфейса в свой наконечник и сделать то же самое.

Удачи!

person coastwise    schedule 08.10.2010
comment
Я пытался следовать вашим инструкциям, но потерялся. Вот что я сделал: - person Mike; 08.10.2010
comment
- Я создал абстрактный UIViewController parentViewController и сделал его родительским классом контроллера представления, чем нужно для моего пользовательского представления. - person Mike; 08.10.2010
comment
- Теперь, когда вы говорите «открыть перо», какое перо вы имеете в виду? Кончик для нового parentViewController, наконечник для настраиваемого представления или наконечник для каждого из моих контроллеров представления, которым необходимо использовать настраиваемое представление? Я предположил, что вы имели в виду перо для каждого из дочерних контроллеров представления. - person Mike; 08.10.2010
comment
- Я переименовал идентичность представления в имя абстрактного родителя. Я поместил элемент UIView в окно макета в нужное мне место и подключил customView к этому UIView. Он по-прежнему отображается как пустое пространство, когда загружается контроллер представления. Что мне не хватает? Я даже попытался изменить идентификатор UIView, который я ввел, на имя моего класса customView. Как он должен узнать, из какого пера загружено пользовательское представление? - person Mike; 08.10.2010
comment
Я отредактировал свой ответ в надежде прояснить решение. открыть перо относится к общему пользовательскому представлению. У parentViewController не должно быть связанного с ним пера, поскольку он предназначен для использования в качестве универсального контроллера. - person coastwise; 09.10.2010
comment
Я не уверен, что вы переименовали в своем последнем комментарии, но я думаю, что вы слишком обдумываете это. Упражнение, которое покажет вам, как это работает: попробуйте создать новый подкласс UITableViewController (без наконечника) и используйте метод, описанный в моем ответе, для заполнения tableHeader содержимым вашего настраиваемого наконечника. После loadNibNamed выполните self.tableView.tableHeaderView = yourOutlet. Ваше настраиваемое представление теперь должно быть в верхней части табличного представления. Так я впервые освоил эту технику. - person coastwise; 09.10.2010