Как подключить IBOutlet к UIView?
Я пытаюсь переключить представления после анимации, как видно:
[UIView beginAnimations: @"Fade Out" context:nil];
[UIView setAnimationDelay:1.0];
[UIView setAnimationDuration:0.25];
splash.alpha = 0.0;
[UIView commitAnimations];
[self.view addSubview : view];
На [self.view addSubview : view];
Я должен добавить имя для представления, чтобы добавить его, поэтому я сделал IBOutlet
вот так: (в первом представлении.h файла контроллера)
IBOutlet UIView *main;
Но когда я пытаюсь подключить *main
UIView
к мнению на раскадровке, это не позволит мне... Большое спасибо, ребята.
4 ответа
Ваша путаница заключается в том, чтобы создавать объекты пользовательского интерфейса в коде и создавать их графически с помощью Interface Builder / раскадровки.
Одна подсказка - использование подсказки препроцессора IBOutlet. IB предназначен для Interface Builder == создания графики (с использованием раскадровки или файла XIB).
Если создавать в раскадровке...
создайте свойство IBOutlet, как вы сделали, хотя полный правильный синтаксис
@property (nonatomic, weak) IBOutlet UIView *main;
перетащите представление "пользовательский вид" из библиотеки объектов на сцену раскадровки.
- Удерживая клавишу CTRL, перетащите из представления в viewController. Вы должны получить список подходящих предметов для подключения. Ваш IBOutlet должен быть в списке. выберите его.
Вся цель IBOutlet - дать вам ссылку на элемент в вашей сцене раскадровки, который вы можете использовать в своем коде.
Вам не нужно будет делать это:
[self.view addSubview : view];
как это уже создано и добавлено в вашу раскадровку. Убедитесь, что он расположен так, как вы ожидаете в иерархии представлений.
Если создание в коде...
Объявите свойство в вашем @interface
@property (nonatomic, strong) UIView *main;
(Нет необходимости в IBOutlet
поскольку вы не связываете это в своей раскадровке. Объявлено "сильный" вместо "слабый", если вы не сразу назначаете его иерархии представления).
Прежде чем добавить эту строку
[self.view addSubview : view];
Вы должны подумать: добавляете ли вы новое представление, которого нет в вашей раскадровке / XIB? Если это так, вы не можете добавить его, пока не создадите его. (Добавление представления, которое ЕСТЬ в вашей раскадровке, не имеет смысла, как оно уже есть, в вашей сцене раскадровки).
Итак, поскольку вы, кажется, делаете это в коде, вам нужно создать представление перед его добавлением.
UIView* myView = [[UIView alloc] init];
установите его свойство frame, чтобы мы знали, где оно появится, когда вы добавите его в иерархию представлений
myView.frame = CGRectMake (CGFloat x, CGFloat y, CGFloat width, CGFloat height);
Присвойте свой недавно созданный вид собственности
self.main = myView;
Добавьте его в вашу иерархию представлений
[self.view addSubview : myView];
Теперь вы можете ссылаться на него в коде, используя self.main. Это так же, как если бы вы добавили его в IB/ раскадровку и перетащили ссылку CRTL на ваш IBOutlet.
Если вы создаете свое представление в коде и сразу добавляете его в иерархию представлений, альтернативой объявлению свойства является установка свойства (числового) тега в представлении, тогда вы можете ссылаться на представление, используя его суперпредставление. viewWithTag:
метод
Единственное, что вы не можете сделать, это создать представление в коде, а затем управлять им с помощью раскадровки.
Я надеюсь, что это все полезно, боюсь, я вас еще больше запутаю!
Я опоздал на это. Но позвольте мне опубликовать то, что я недавно узнал в любом случае.
У меня такая ситуация:
1) BaseViewController, который содержит MenuView(пользовательский UIView)
2) MenuView содержит menuTable, который содержит все пункты меню
3) На StoryBoard у меня есть сцена BaseViewController с MenuView и MenuTableView
Я мог бы иметь ссылку IBOutlet на menuTable, которую мы обычно делаем, перетаскивая таблицу на раскадровке в BaseViewController.h. Но я хочу, чтобы пользовательский MenuView отвечал за заполнение MenuTable как задачи разделения. Для этого мне нужно эталонное соединение IBOutlet из MenuView.h с таблицей меню на раскадровке.
Так вот что я сделал:
1) Сначала создайте свойство IBOutlet таблицы в MenuView.h @property (слабое, неатомное) IBOutlet UITableView * menuTable;
2) Как только свойство создано, слева от объявления свойства появляется маленький кружок, указывающий, что это переменная IBOutlet.
3) Теперь, когда StoryBoard открыт и MenuView.h открыт в Assistant Editor в XCode, я могу щелкнуть по кругу и перетащить его в таблицу на раскадровке. (Примечание: если я попытаюсь перетащить таблицу из StoryBoard в MenuView.h, это не позволит мне. Обратите внимание, почему)
Вот и все. Теперь я установил соединение IBOutlect от пользовательского UiView до StoryBoard.
Примечание. Я использую XCode 7 и ориентирован на устройства iOS 7 и более поздние версии. (Если это имеет значение)
Вы объявляете представление как собственность?
Синтаксис должен быть примерно таким:
@property (nonatomic, weak) IBOutlet UIView *main;
Если вы новичок в Xcode или Storyboards, вам следует взглянуть на этот основной урок: