Где загружать пользовательские элементы пользовательского интерфейса в контроллер представления

#ios #objective-c #uiview

#iOS #objective-c #uiview

Вопрос:

Если я хочу добавить пользовательские элементы пользовательского интерфейса из кода, где я должен их создать? В методе layoutSubviews или где-то еще? Кроме того, при создании кнопки есть ли что-то особенное, что мне нужно добавить помимо обычного кода UIButton?

Допустим, у вас есть контроллер представления с именем VC и подкласс UIView с именем TheMenu. В VC есть кнопка, в которую будет вставляться меню слева. Это будет несколько напоминать скользящие меню в таких приложениях, как Facebook.

Я понимаю, что в классе VC я мог бы просто вызвать UIView следующим образом:

 -(void)addItemsToVC
{
    self.uiview = [[TheMenu alloc] initWithFrame:CGRectMake(some numbers)];
    [self.view addSubview:self.uiview];
}
  

и это создало бы экземпляр нового объекта класса TheMenu для использования в моем VC. Просто пытаюсь выяснить, где создавать мои элементы в TheMenu и нужны ли им какие-либо дополнительные строки TLC, которые могут не отображаться при обычной сборке кнопок, например:

 UIButton *button = [UIButton new];
button.frame = CGRectMake:(some numbers);
button.backgroundColor = [UIColor someColor];
button.titleLabel.textColor = [UIColor someColor];
button.titleLabel.text = @"some title";
[self.view addSubview:button];
  

Спасибо за помощь.

Комментарии:

1. Если вы хотите сделать все это в коде, затем поместите любую настройку subview для меню (например, код кнопки, который вы показываете) в его initWithFrame: метод.

2. Конечно, не в layoutSubviews, поскольку это также вызывается при вращении. Их создание добавило бы еще один из них при каждом повороте. layoutSubviews используется, как следует из его названия, для размещения уже существующих вложенных представлений.

Ответ №1:

Я всегда предпочитаю загружать содержимое представления из файла XIB или раскадровки, а не загружать их создание в коде.

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

Другой подход, который я использовал, — создать представление в отдельном VC и загрузить его с помощью loadNibNamed:owner:options:'. You make the file's owner on the other XIB file be the same as your view controller, and hook up outlets outlets/actions as needed on the secondary XIB file. Those outlets will be nil, but when you execute the call to loadNibNamed:owner:options:’ , система загрузит ваши дополнительные представления. Вы можете сначала сделать внешний вид «трея» невидимым. Затем добавьте код, который перемещает его за пределы экрана, делает его видимым и анимирует его обратно на экран, чтобы он скользил по экрану. Вы также можете использовать этот подход «дополнительный файл XIB» в приложении на основе раскадровки.

Комментарии:

1. Я создал TheMenu, чтобы его можно было вызывать на многих разных экранах нажатием кнопки. UIView отображается при нажатии кнопки, но в нем отсутствует его содержимое. В layoutSubviews я вызвал [super layoutSubviews]; затем добавил необходимые объекты, которые я хочу показать в своем представлении, но они не отображаются. Я думаю, что мне чего-то не хватает в методе layoutSubview, возможно, чего-то в коде для объектов в UIView или, возможно, другого метода создания кнопок и т. Д., Которые будут отображаться в этом UIView.

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

3. Вы не должны добавлять / удалять представления в layoutSubviews. Это предназначено для определения положения представлений, а не для добавления / удаления. Почему вы ждете, пока не нажмете кнопку, чтобы добавить вложенные представления в свой «ящик»? Вы можете настроить всю эту настройку со всем ее содержимым, но либо скрыть, переместить за пределы экрана, либо и то, и другое, а затем отобразить ее и / или переместить на экран нажатием кнопки.

Ответ №2:

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

Комментарии:

1. Если вы хотите поддержать чей-то ответ, пожалуйста, используйте upvote вместо добавления другого ответа.

2. Я надеюсь, что кто-нибудь сможет прокомментировать это после того, как я прокомментирую, чтобы я мог позже добавить способ, которым я выполнил слайд-меню. Это было довольно просто по сравнению со многими другими методами и не требует использования чужой библиотеки. Мне нужно подождать до завтрашнего утра, поскольку у меня нет «уличного кредита», чтобы ответить на него немедленно. Я не хочу удалять это на случай, если другие смогут его использовать, поскольку у Дункана есть отличные знания, которые, как я чувствую, могут пригодиться другим. Я просто знаю, что попытка найти способ реализовать боковое меню не была плодотворной, и мой путь прост для многих. Всем отличных выходных.

3. Я не понимаю. С ограниченной репутацией вы не можете комментировать дважды подряд? Если мой ответ (с использованием второго контроллера представления и перехода к встраиванию?) Решил вашу проблему, тогда вы должны принять мой ответ и опубликовать комментарий (или отредактировать свой вопрос), объясняющий, что вы сделали.

4. @LordZsolt: я проголосовал за ответ Дункана С. Я хотел что-то добавить к его ответу. Том: Использование чужой библиотеки действительно может вам помочь. Это означало бы, что вам нужно написать меньше кода.

5. Я не использовал ваш метод Duncan, я просто заставил свой работать. Все дело было в настройке свойств кнопки, таких как заголовок и так далее. Как только я изменил их, все заработало просто отлично. Я просто комментировал, что метод Дункана также имеет смысл, но я не буду останавливаться на проблеме, которая, как я знаю, должна работать, пока не найду ответ. В понедельник я опубликую все, что я сделал, чтобы создать выдвижное меню. Хороших выходных.