Основная практическая причина использования только одного контроллера представления на экран заключается в том, что это единственный способ управлять навигацией.
Например, предположим, что у вас есть экран с двумя отдельными контроллерами представления, и вы загружаете его с помощью контроллера навигации. На какой из двух контроллеров представления вы нажимаете и как загружаете и ссылаетесь на второй? (Не говоря уже о необходимости одновременной координации двух отдельных контроллеров.)
Я не думаю, что использование одного настраиваемого контроллера является большой проблемой, как вы думаете.
Помните, нет необходимости, чтобы TableviewDataSource и TableViewDelegate были в реальном контроллере. Шаблоны Apple просто делают это для удобства. Вы можете поместить методы, реализующие оба протокола, в один класс или разделить их каждый в свой собственный класс. Затем вы просто связываете их с таблицей в своем пользовательском контроллере. Таким образом, все, что нужно сделать пользовательскому контроллеру - это управлять фреймом самого tableview. Вся конфигурация и управление данными будут в отдельных и автономных объектах. Пользовательский элемент управления может легко отправлять им сообщения, если вам нужны данные из других элементов пользовательского интерфейса.
Этот тип гибкости, настройки и инкапсуляции - вот почему шаблон проектирования делегата используется в первую очередь. Вы можете настроить черт из чего угодно, не создавая один класс монстров, который делает все. Вместо этого вы просто вставляете делегатский модуль и уходите.
Edit01: Ответ на комментарий
Если я правильно понимаю ваш макет, ваша проблема в том, что UITableViewController жестко настроен для установки таблицы для заполнения доступного представления. В большинстве случаев табличное представление является самим видом сверху, и это работает. Основная функция UITableViewController состоит в том, чтобы расположить таблицу, поэтому, если вы используете нестандартный макет, он вам не нужен. Вы можете просто использовать универсальный контроллер представления и позволить перо установить рамку таблицы (или сделать это программно). Как я уже сказал, легко представить, что методы делегата и источника данных должны быть в контроллере, но это не так. Вам просто нужно избавиться от tableViewController, потому что он бесполезен в вашем конкретном проекте.