Исправлен заголовок для UITableview?
У меня есть UITableView
, что я хотел бы придерживаться подпрограммы на 44 пикселя. Я пробовал tableViewHeader
, но прокручивается с остальной частью таблицы.
Я попробовал поиск и нашел много людей, говорящих, что мне нужно добавить супервизор UIView, а затем добавить в него свой заголовок и UITableView. Однако я не могу найти пример, как именно это сделать. Я попытался создать новый подкласс UIView и выложить подпрограммы в IB, но у меня возникли проблемы с подключением контроллера таблицы к UITable (потому что я недостаточно знаю об IB).
Как я могу сделать это с XIB? Может ли кто-нибудь привести пример?
Спасибо за любую помощь, которую вы, ребята, можете предоставить.
Ответы
Ответ 1
Я, наконец, понял это сразу после публикации. Цифры.:)
Вот что я сделал, если другие сталкиваются с одной и той же проблемой:
-
Удалите существующий UITableViewController
и его XIB. Они хлам. Будьте действительно сумасшедшими, пока вы делаете.
-
Создайте новый подкласс UIViewController
с XIB
-
Откройте XIB в IB и добавьте материал заголовка и UITableView
в UIView
-
В IB Outlets для UITableView
убедитесь, что вы подключили Delegate и DataSource к файловому владельцу
-
В заголовке вашего контроллера просмотра обязательно добавьте <UITableViewDelegate, UITableViewDataSource>
для реализации этих протоколов.
-
Внедрите все регулярные UITableView
методы делегата и источника данных, которые вы знаете и любите, но в своем UIViewController
вместо того, как вы привыкли делать это через UITableViewController
После этого все должно работать.
Ответ 2
Проблема заключается в том, что свойство UITableViewController view - это то же самое, что и свойство tableView. У меня была та же проблема, и я хотел поставить некоторый фиксированный контент над таблицей. Я не хотел менять базовый класс, так как он обеспечивает большую функциональность, которую я не хотел потерять или нарушить.
Исправление на самом деле легко. Фокус в том, чтобы создать пользовательский набор и получить свойство self.tableView. Затем в loadView вы заменяете представление новым UIView и добавляете к нему tableView. Затем вы можете добавлять подпрограммы вокруг tableView. Вот как это делается:
В заголовке:
@interface CustomTableViewController : UITableViewController
{
UITableView *tableView;
}
В .m:
- (UITableView*)tableView
{
return tableView;
}
- (void)setTableView:(UITableView *)newTableView
{
if ( newTableView != tableView )
{
[tableView release];
tableView = [newTableView retain];
}
}
- (void)loadView {
[super loadView];
//save current tableview, then replace view with a regular uiview
self.tableView = (UITableView*)self.view;
UIView *replacementView = [[UIView alloc] initWithFrame:self.tableView.frame];
self.view = replacementView;
[replacementView release];
[self.view addSubview:self.tableView];
//code below adds some custom stuff above the table
UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)];
customHeader.backgroundColor = [UIColor redColor];
[self.view addSubview:customHeader];
[customHeader release];
self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height);
}
Наслаждайтесь!
Ответ 3
В качестве опции можно вставить UITableViewController как часть пользовательского интерфейса в другой UIViewController с элементом Контейнер "(выберите один из них в Interface Builder из библиотеки объектов (где все остальные представления)).
Таким образом вы можете использовать UITableViewController, как обычный вид (с точки зрения позиционирования), и составить любой макет, который вам нужен, не перезаписывая существующий код представления таблицы.
EDIT:
для дальнейшего расширения моего ответа, вот шаги для выполнения описанного подхода:
- Откройте сценарий в построителе интерфейса.
- Перетащите новый элемент
ViewController
в раскадровку из Object Library
, чтобы добавить новый контроллер.
-
Как дочернее представление, перетащите Container View
из библиотеки объектов и поместите его где-нибудь внутри ViewController
-
Container View
создает другой контроллер представления и "встроенный" сегмент как соединение. Он сохранит, чтобы удалить этот ViewController
и подключить Container View
к требуемому view controller
(в соответствии с вопросами, которые он выполняет UITableViewController)
- Чтобы подключить
Container View
с помощью UITableViewController
, просто выберите Container View
и перетащите + перетащите в UITableViewController - выберите "Вставить" во всплывающем меню
Теперь контроллер будет отображаться внутри Container View
относительно положения и границ контейнера.
Можно получить ссылку на контроллер расширенного представления - система будет запускать метод prepareForSegue для контроллера представления хоста (созданный на шаге 1 выше), а контроллер находится в свойстве segue.destinationViewController - можно настроить его как обязательный. Просто убедитесь, что вы установите идентификатор "встроенного" segue в построителе интерфейса - это тот же процесс, что и для любых других сегментов.
Ответ 4
Замените TableViewController на ViewController, внутри него добавьте UIView с фиксированной высотой, чтобы разместить фиксированный контент, который вам нужен, и ниже, чтобы добавить UITableView.
Создайте выход в TableView
@IBOutlet weak var tableView: UITableView!
Вы можете повторно использовать все функции, которые вы уже удалили, например, слово переопределения
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let c = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell!
c.textLabel?.text = "A title"
c.detailTextLabel?.text = "A subtitle"
return c
}
См. этот ответ, чтобы добавить автоматический контроль обновления, если вам это нужно Потянуть, чтобы обновить UITableView без UITableViewController
Ответ 5
Определите пользовательский UIView в раскадровке или xib, используйте ссылку IBOutlet для этого UIView в View Controller. В методе -(void)viewWillAppear:(BOOL)animated
напишите [self.tableView.superview addSubview:filterHeaderView];
, здесь filterHeaderView
- ссылка IBOutlet для моего заголовка, которую я хочу добавить как фиксированный заголовок в моем представлении таблицы.