Как подключить 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;

Но когда я пытаюсь подключить *mainUIView к мнению на раскадровке, это не позволит мне... Большое спасибо, ребята.

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, вам следует взглянуть на этот основной урок:

Начало раскадровки в iOS 5, часть 1

Начало раскадровки в iOS 5, часть 2

Другие вопросы по тегам