Как я могу дать одинаковый вид всем моим UITableViews через мое приложение? - PullRequest
2 голосов
/ 05 сентября 2011

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

У меня есть приложение с четырьмявкладки, каждая вкладка содержит контроллер навигации с табличным представлением.Я не использую UITableViewController подклассы, так как я хочу иметь статическое представление поверх некоторых таблиц и фоновое изображение ниже всего.Я также использую различные типы пользовательских ячеек (в основном с изображениями и кодом в -willDisplayCell).Поскольку я хочу, чтобы все мои таблицы выглядели одинаково, мне интересно, как я мог бы повторно использовать некоторый код, но у меня возникли проблемы, чтобы понять это.Нужно ли создавать «базовый» подкласс UIViewController с выходом UITableView, а затем использовать его как мой суперкласс?Или мне нужно просто реализовать мой UITableViewDelegate в отдельном классе и использовать объект этого класса в качестве делегата табличного представления?Или я должен использовать пользовательский UITableView и вместо него подкласс?

Я мог бы дать больше подробностей, если это необходимо, но я полагаю, этого достаточно для начала обсуждения.Спасибо за любую помощь!

Ответы [ 5 ]

6 голосов
/ 15 сентября 2011

Я бы рассмотрел создание подкласса UITableView и настройку dataSource и delegate на самоопределение и реализацию логики графического интерфейса внутри класса и создание настраиваемой логики для ввода и вывода данных (возможно, переадресацию некоторых функций делегата dataSource / control одному ваших VC).

Код размещения для ячеек действительно должен быть размещен внутри логики ячеек! Вы должны рассмотреть возможность создания пользовательских подклассов UITableViewCell (и, возможно, XIB для них), которые содержат логику для разметки и повторного использования. (Может быть, dataObject свойство, которое заставляет ячейку читать вашу модель ?!). Затем вы можете использовать свой подкласс UITableView для создания и управления этими ячейками (например, отображение между классами модели и именами XIB)

Это, вероятно, способ генерировать много кода для многократного использования, где вам просто нужно изменить детали, такие как добавление классов модели или изменение их макета, или подклассы классов модели или подкласс UITableViewCells.

0 голосов
/ 15 сентября 2011

Я делаю это, создавая один базовый класс (либо uiviewcontroller, либо uitableviewcontroller) и имея новый метод init с Type.Например, если вы создаете это в коде (не-nib)

  • (id) initWithType: (NSInteger) tabtype;

Сделайте этот базовый класс также вашим делегатом/ datasource, и реализовать все необходимые методы.В зависимости от того, для какой вкладки был создан экземпляр viewcontroller, настройте методы источника данных - настройте отображение различных данных.Способы делегирования, вероятно, все еще одинаковы для всех контроллеров представления, поэтому ничего не меняется.

Обычно я делаю UI в коде, поэтому вы можете сделать статическое представление, используя viewcontroller с подпредставлением tableView, или вы можете также включить статическое представлениеВ верхней части UITableView, добавив его в tableView в качестве подпредставления, затем переопределите layoutSubviews, чтобы настроить координату y, чтобы она выглядела как статичная в одном месте.(Сеанс WWDC2011 Advanced Scrollview Techniques показывает, как это сделать).

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

Теперь, так как ваш код включен в базовый класс, если вы хотите внести изменения, то это только один класс для изменения.

0 голосов
/ 05 сентября 2011

Один из возможных способов сделать это - создать собственное представление, которое наследует UITableView.переопределите initWith - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style и установите графический интерфейс, который вы хотите использовать в таблице.

Теперь вы можете использовать этот класс в своем приложении где угодно.

Теперь, когда вы используете разные шаблоны ячеек, предложит вам создать один класс для каждой ячейки, а внутри вашего cellForRowAtIndexPath сделать объект другимячейка на основе какого-либо флага или структуры данных.Прочитайте Factory Design Pattern, чтобы глубже понять эту концепцию.

Базовый процесс будет таким:

  1. Назначьте новую пользовательскую таблицу.
  2. Назначьте источник данных и делегируйтетот же класс таблицы ИЛИ для класса, который содержит таблицу.
  3. Загрузка данных в таблицу.-> Здесь при загрузке данных выясните, какие данные используются.Основываясь на данных, создайте объект относительной ячейки.

Это сделает все ячейки и таблицы многократно используемыми во всем приложении.

Для получения более подробной информации читайте о Pattern Design Design.Отправьте, если нужно для деталей.

0 голосов
/ 05 сентября 2011

Ну, я бы действительно сказал, что лучше всего было бы наследовать ваши UITabBarController s от MasterController.

Внутри этой MasterController viewDidLoad или viewWillLoad вы можете написать общий макети настройки, которые позже будут использоваться вашими подклассами.

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

Это также может бытьПриятно иметь один базовый NIB-файл, загруженный через этот MasterController, и для которого пользовательский макет может быть выполнен в дочерних контроллерах (например, в методе initWithNibName:bundle:.

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

Надеюсь, это поможет.

EDIT : Способ NIBЕсли вы решили использовать файл NIB, вы все равно можете использовать один MasterController, выполнив следующие действия:

  1. В вашем MasterController создайте необходимые выходы (здесь я думаю, что вам нужен только TableView, но это может бытьболее сложный)
  2. В InterfaceBuilder настройте свои соединения, как обычно
  3. В своем коде при создании UITabViewController s вы будете использовать [[YourTabBarController alloc] initWithNibName:@"YourMasterNIBFile.xib" bundle:nil]

Поскольку выходы будут наследоваться, ваш класс YourTabBarController, который будет наследовать YourTabBarController, будет иметь всю необходимую информацию для правильного построения вашего представления.

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

0 голосов
/ 05 сентября 2011

Из интереса, почему вы хотите иметь статическое представление поверх ячеек табличного представления?

С помощью UITableViewController вы можете создать фоновое изображение за ячейками табличного представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...