Подтвердить что ты не робот

Исправлен заголовок для UITableview?

У меня есть UITableView, что я хотел бы придерживаться подпрограммы на 44 пикселя. Я пробовал tableViewHeader, но прокручивается с остальной частью таблицы.

Я попробовал поиск и нашел много людей, говорящих, что мне нужно добавить супервизор UIView, а затем добавить в него свой заголовок и UITableView. Однако я не могу найти пример, как именно это сделать. Я попытался создать новый подкласс UIView и выложить подпрограммы в IB, но у меня возникли проблемы с подключением контроллера таблицы к UITable (потому что я недостаточно знаю об IB).

Как я могу сделать это с XIB? Может ли кто-нибудь привести пример?

Спасибо за любую помощь, которую вы, ребята, можете предоставить.

4b9b3361

Ответ 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 для моего заголовка, которую я хочу добавить как фиксированный заголовок в моем представлении таблицы.