Нельзя подключать IBOutlets к различным сценам в раскадровке. Каждая сцена полностью автономна и связана только через сегменты (или отношения в случае специальных контроллеров представления контейнера, таких как вкладка, навигация, разделенное представление и контроллеры всплывающих окон). Если вы выполнили какую-либо работу с IB без раскадровок, представьте, что каждая сцена (контроллер представления) находится в своем собственном перо (фактически, это то, что раскадровки делают за кадром).
Кроме того, обычно (по крайней мере, на iPhone) существует однозначное сопоставление между контроллером представления и «экраном» пользовательского интерфейса - у вас обычно нет разных контроллеров представления, управляющих разными частями экрана, как это имеет место с заголовком, таблицей и нижним колонтитулом, которые у вас есть. (Таким образом, у вас почти никогда не будет IBOutlet для любого подкласса UIViewController
.)
Так что же может вы делаете? Вот несколько разных подходов, от простого к сложному:
UITableView верхний и нижний колонтитулы
Если вы хотите присвоить этим представлениям верхнего и нижнего колонтитула свойства UITableView
tableHeaderView
и tableFooterView
, вы можете сделать это в раскадровке в IB - просто перетащите UIView некоторого вида из библиотека по направлению к верхней или нижней части таблицы, пока не появится синяя линия над или под ячейками прототипа:
Представления верхнего и нижнего колонтитула таблицы могут соответствовать или не соответствовать тому, что вам нужно: они являются частью прокручиваемого содержимого таблицы (то есть они отображаются над первой строкой и под последней, соответственно, чтобы их можно было прокручивать с экрана).
Вид сверху и снизу
Если вы планируете использовать эти представления как «верхний и нижний колонтитулы» в том смысле, что они всегда появляются над или под таблицей независимо от того, где она прокручивается, тогда вам действительно нужно иметь верхний и нижний колонтитулы и табличное представление все будут подпредставлениями корневого представления.
Для этого вам понадобится обычный UIViewController
подкласс, а не UITableViewController
подкласс. Вы можете поместить UITableView
в качестве подпредставления корневого представления этого контроллера представления и упорядочить любые другие представления, которые вы хотите видеть выше / ниже него. (Просто убедитесь, что автоматическое изменение размера установлено разумно, если вы планируете поддерживать вращение.) Вот пример:
(Если вам интересно, где находятся ячейки прототипа, когда вы впервые перетаскиваете табличное представление, проверьте инспектор - вы установите их количество в правом верхнем углу этого снимка экрана.)
Виды верхнего уровня
С помощью обычных перьев (не раскадровок) вы можете настроить представления в IB, которые не являются корневым представлением контроллера представления. Затем вы все равно можете подключить к ним розетки и программно вставить их в иерархию представления по мере необходимости.
Вы также можете сделать это в раскадровке - перетащить представления на черную полосу под сценой - но из-за ошибки в текущей версии Xcode вы не можете видеть эти представления для редактирования. К сожалению.
Контроллеры с несколькими представлениями, действительно
Если ничего из вышеперечисленного не удовлетворяет вашим потребностям, вы все равно можете использовать несколько контроллеров представления - скажем, если вы хотите переключать разные представления заголовка в разное время и экономить память, динамически создавая эти иерархии представления как необходимо. Случаи, подобные этому, довольно редки, хотя ... сначала вы должны убедиться, что вы исчерпали другие варианты.
По сути, вы все еще используете один из двух предыдущих подходов, но нужные вам представления находятся в других сценах (опять же, они как будто в других перьях). Здесь контроллеры представлений, содержащие другие представления, даже не должны быть пользовательскими подклассами UIViewController
, поскольку они являются просто временными контейнерами для представлений, которые вы хотите вставить в иерархию представлений другого контроллера представления.
В этом случае у вас есть раскадровка, которую вы хотите ... это просто вопрос правильной загрузки этих контроллеров представления, что вы можете сделать таким образом:
SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"];
Затем извлеките свойство view
из каждого контроллера представления, вставьте его в иерархию представлений вашего "основного" контроллера представления и избавьтесь от контроллера представления, из которого вы извлекли его.