Как вы подключаете IBOutlets к различным сценам в раскадровке Interface Builder? - PullRequest
4 голосов
/ 16 декабря 2011

У меня есть пользовательский UITableViewController с 2 свойствами:

@property (strong, nonatomic) IBOutlet VenueHeaderViewController *header;
@property (strong, nonatomic) IBOutlet VenueFooterViewController *footer;

UIView s моих VenueHeaderViewController и VenueFooterViewController были разработаны в IB.Каждый из этих контроллеров имеет IBOutlet s для своих подпредставлений, как установлено в раскадровке.Это моя раскадровка:

http://s3.amazonaws.com/luka/storyboard.png

Мой вопрос: как мне теперь подключить мои header и footer IBOutlet s внутри моего UITableViewController к экземплярам моегоVenueHeaderViewController и VenueFooterViewController при сохранении макета и IBOutlet с, которые я настроил в раскадровке?

1 Ответ

5 голосов
/ 05 апреля 2012

Нельзя подключать IBOutlets к различным сценам в раскадровке. Каждая сцена полностью автономна и связана только через сегменты (или отношения в случае специальных контроллеров представления контейнера, таких как вкладка, навигация, разделенное представление и контроллеры всплывающих окон). Если вы выполнили какую-либо работу с IB без раскадровок, представьте, что каждая сцена (контроллер представления) находится в своем собственном перо (фактически, это то, что раскадровки делают за кадром).

Кроме того, обычно (по крайней мере, на iPhone) существует однозначное сопоставление между контроллером представления и «экраном» пользовательского интерфейса - у вас обычно нет разных контроллеров представления, управляющих разными частями экрана, как это имеет место с заголовком, таблицей и нижним колонтитулом, которые у вас есть. (Таким образом, у вас почти никогда не будет IBOutlet для любого подкласса UIViewController.)

Так что же может вы делаете? Вот несколько разных подходов, от простого к сложному:

UITableView верхний и нижний колонтитулы

Если вы хотите присвоить этим представлениям верхнего и нижнего колонтитула свойства UITableView tableHeaderView и tableFooterView, вы можете сделать это в раскадровке в IB - просто перетащите UIView некоторого вида из библиотека по направлению к верхней или нижней части таблицы, пока не появится синяя линия над или под ячейками прототипа:

drag view to table footer

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

Вид сверху и снизу

Если вы планируете использовать эти представления как «верхний и нижний колонтитулы» в том смысле, что они всегда появляются над или под таблицей независимо от того, где она прокручивается, тогда вам действительно нужно иметь верхний и нижний колонтитулы и табличное представление все будут подпредставлениями корневого представления.

Для этого вам понадобится обычный UIViewController подкласс, а не UITableViewController подкласс. Вы можете поместить UITableView в качестве подпредставления корневого представления этого контроллера представления и упорядочить любые другие представления, которые вы хотите видеть выше / ниже него. (Просто убедитесь, что автоматическое изменение размера установлено разумно, если вы планируете поддерживать вращение.) Вот пример:

table view as subview

(Если вам интересно, где находятся ячейки прототипа, когда вы впервые перетаскиваете табличное представление, проверьте инспектор - вы установите их количество в правом верхнем углу этого снимка экрана.)

Виды верхнего уровня

С помощью обычных перьев (не раскадровок) вы можете настроить представления в IB, которые не являются корневым представлением контроллера представления. Затем вы все равно можете подключить к ним розетки и программно вставить их в иерархию представления по мере необходимости.

Вы также можете сделать это в раскадровке - перетащить представления на черную полосу под сценой - но из-за ошибки в текущей версии Xcode вы не можете видеть эти представления для редактирования. К сожалению.

Контроллеры с несколькими представлениями, действительно

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

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

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

SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"];

Затем извлеките свойство view из каждого контроллера представления, вставьте его в иерархию представлений вашего "основного" контроллера представления и избавьтесь от контроллера представления, из которого вы извлекли его.

...