Исправлен заголовок для UITableview? - PullRequest
17 голосов
/ 05 августа 2011

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

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

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

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

Ответы [ 5 ]

34 голосов
/ 06 августа 2011

Я наконец понял это сразу после публикации. Цифры. :)

Вот что я сделал, если другие столкнулись с той же проблемой:

  1. Удалить существующий UITableViewController и его XIB. Они мусор. Разозлитесь, пока вы делаете.

  2. Создать новый UIViewController подкласс с XIB

  3. Откройте XIB в IB и добавьте заголовок и UITableView к UIView

  4. В выходах IB для UITableView убедитесь, что вы подключили Delegate и DataSource к своему владельцу файла

  5. В заголовке вашего контроллера представления обязательно добавьте <UITableViewDelegate, UITableViewDataSource> для реализации этих протоколов

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

После этого все должно работать.

9 голосов
/ 31 января 2012

Проблема в том, что свойство view UITableViewController - это то же самое, что и свойство tableView. У меня была та же проблема: я хотел поместить фиксированный контент над таблицей. Я не хотел менять базовый класс, поскольку он предоставляет множество замечательных функций, которые я не хотел терять или нарушать.

Исправить на самом деле легко. Хитрость заключается в том, чтобы создать собственный набор и получить свойство self.tableView. Затем в loadView вы заменяете представление новым UIView и добавляете tableView к нему. Тогда вы можете добавлять подпредставления вокруг tableView. Вот как это делается:

В шапке:

@interface CustomTableViewController : UITableViewController
{
    UITableView *tableView;
} 

В .м:

- (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);
}

Наслаждайтесь!

1 голос
/ 28 октября 2015

Замените 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

1 голос
/ 25 октября 2014

В качестве опции можно встроить UITableViewController как часть пользовательского интерфейса в другой UIViewController с элементом Container View '(выберите один в Интерфейсном Разработчи библиотека объектов (где все остальные виды)).

Таким образом, вы можете использовать UITableViewController как обычный вид (с точки зрения позиционирования) и создавать любой макет без необходимости перезаписывать существующий код табличного представления

EDIT:

для дальнейшего расширения моего ответа, вот шаги для выполнения описанного подхода:

  1. Открой свой рассказчик в конструкторе интерфейсов
  2. Перетащите новый элемент ViewController на раскадровку из Object Library, чтобы добавить новый контроллер.
  3. В качестве дочернего представления перетяните Container View из библиотеки объектов и поместите его в любое место внутри ViewController

  4. Container View создает другой контроллер вида и "внедряет" segue в качестве соединения. Можно сохранить это viewcontroller и подключить Container View к необходимому view controller (в соответствии с вопросами это UITableViewController)

  5. Чтобы соединить Container View с UITableViewController, просто выберите container view и удерживайте нажатой клавишу Control +, перетащите его на UITableViewController - выберите «Вставить» во всплывающем меню

Теперь контроллер будет отображаться внутри Container View относительно позиции и границ контейнера.

Можно получить ссылку на встроенный контроллер представления - система запустит метод "prepareForSegue" хоста viewcontroller (созданного на шаге 1 выше), а контроллер находится в свойстве segue.destinationViewController - его можно настроить как требуется. Просто убедитесь, что вы установили идентификатор для «встроенного» сегмента в построителе интерфейса - это тот же процесс, что и для любых других сегментов.

0 голосов
/ 11 января 2016

Определите пользовательский UIView в раскадровке или XIB, имейте ссылку на IBOutlet для этого UIView в View Controller. В -(void)viewWillAppear:(BOOL)animated метод write [self.tableView.superview addSubview:filterHeaderView];, здесь filterHeaderView - ссылка на IBOutlet для моего представления заголовка, которую я хочу добавить в качестве фиксированного заголовка в моем табличном представлении.

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