Как добавить UIView над текущим UITableViewController - PullRequest
55 голосов
/ 10 января 2011

У меня возникают трудности при добавлении подпредставления (UIView) из метода viewDidLoad UITableViewController

Это работает:

[self.view addSubview:self.progView];

Но вы можете видеть, как линии ячеек таблицы отбираются через UIViewprogView.

Я пробовал этот подход:

[self.view.superview insertSubview:self.progView aboveSubview:self.view];

Это попытка добавить progView, UIView к суперпредставлению, поверх текущего представления.Когда я пытаюсь это сделать, UIView никогда не появляется.

- ОБНОВЛЕНИЕ -

Ниже приводится последняя попытка:

UIView *myProgView = (UIView *)self.progView; //progView is a method that returns a UIView

[self.tableView insertSubview:myProgView aboveSubview:self.tableView]; 
[self.tableView bringSubviewToFront:myProgView];

Результат совпадает с [self.view addSubview: self.progView];UIView появляется, но, похоже, за столом.

Ответы [ 19 ]

93 голосов
/ 13 февраля 2013

Я попробовал подход выше, но не получил его на работу.Я также обнаружил, что для этого требуется слишком много конфигурации и кода, поскольку для этого необходимо настроить представление таблицы с нуля (что легко сделать из раскадровки).

Вместо этого я добавил представление, которое хотелдобавить выше мой UITableView в представление UINavigationController UITableViewController следующим образом:

[self.navigationController.view addSubview:<view to add above the table view>];

Этот подход требует, чтобы вы встроили UITableViewController в UINavigationController, но даже если вам не нужен контроллер навигации, вы все равно можете использовать контроллер навигацииэтот подход и просто скрыть панель навигации.

28 голосов
/ 27 апреля 2013

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

Если ваш контроллер является UITableViewController в раскадровке или XIB и вы хотите переназначить self.view для стандартного UIView при сохранении существующего представления таблицы:

Добавьте эти переменные экземпляра в заголовочный файл :

IBOutlet UITableView *tableViewReference; // to keep a reference to the tableview
UIView *viewReference; // a reference to the new background view

В файле Storyboard или XIB: Соедините tableView в UITableViewController с переменной tableViewReference.

Тогда в вашем файле реализации :

// Override the default accessors of the tableview and view
- (UITableView*)tableView { return tableViewReference; }
- (UIView*)view { return viewReference; }

- (void)viewDidLoad
{
    [super viewDidLoad];

    // instantiate the new self.view, similar to the tableview
    viewReference = [[UIView alloc] initWithFrame:tableViewReference.frame];
    [viewReference setBackgroundColor:tableViewReference.backgroundColor];
    viewReference.autoresizingMask = tableViewReference.autoresizingMask;
    // add it as a subview
    [viewReference addSubview:tableViewReference];

    /* remainder of viewDidLoad */

}

Хотя это может показаться странным, UITableViewController делает много необычных вещей со ссылками за кулисами. Вам нужно подождать до viewDidLoad, чтобы сделать обмен. После этой точки средства доступа будут указывать на правильные UIView и UITableView.

Использование: Что-то вроде

    [self.view addSubview:myView];

добавит UIView myView перед табличным представлением, без myView прокрутки с содержимым табличного представления.

Примечание: Этот ответ был отредактирован после того, как было указано, что решение содержит пограничный парадоксальный код. UITableViewController делает странные вещи с ссылками, которые он содержит. Некоторый более тщательный тест вывел этот более простой ответ:)

11 голосов
/ 07 декабря 2012

Я смог добавить подпредставление поверх uitableviewcontroller с помощью содержимого uiviewcontroller.

UITableViewController на самом деле очень удобен, когда речь идет о статических ячейках, и это, вероятно, единственный раз, когда общий ответ "простоuse uitableview "может фактически быть нежизнеспособным.

Так вот, как я это делаю.

  1. присваивает вашему UITableViewController идентификатор StoryBoard, т.е. MyStaticTableView
  2. создайте новый UIViewController подкласс и назовите его UITableViewControllerContainer
  3. поместите этот контроллер на место вашего UITableViewController внутриваша раскадровка
  4. добавить подпредставление к новому контроллеру и связать его с выходом, который называется " view_container "
  5. на вас UITableViewControllerContainer метод viewDidLoad

добавить код, например:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UITableViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"MyStaticTableView"];
    [self addChildViewController:vc];
    [self.view_container addSubview:vc.view];
}

Проблемы, которые могут возникнуть:

  1. , если у вас есть дополнительныезатем добавьте флаг «хочет полноэкранный» в ваш UITableViewController
  2. , если он не изменяется должным образом в вашем UITableViewControllerContainer

добавьте код:

- (void)viewWillAppear:(BOOL)animated
{
    [[self.view_container.subviews lastObject] setFrame:self.view.frame];
}

В этот момент из вашего UITableViewController вы можете получить доступ к вашему представлению контейнера напрямую с помощью

self.view.superview.superview

, и все, что вы добавите к нему, будетпокажи сверху свой контроллер вида таблицы

11 голосов
/ 06 апреля 2014

Вы можете увеличить zPosition слоя вашего вида.

Это заставит его отображаться над другими представлениями (по умолчанию zPosition которых равно 0)

self.progView.layer.zPosition++;
[self.view addSubview:self.progView];
8 голосов
/ 05 апреля 2018

Свифт 2018

Вот мой путь с раскадровкой:

1) Добавить представление в раскадровку.
enter image description here

2) Свяжите его с классом UITableViewController:

@IBOutlet weak var copyrightLabel: UILabel!

3) Добавьте его в коде

self.navigationController?.view.addSubview(copyrightView)
copyrightView.frame = CGRect(x: 0,
                            y: self.view.bounds.size.height - copyrightView.bounds.size.height,
                            width: self.view.bounds.size.width,
                            height: copyrightView.bounds.size.height)

4) Вуаля!
enter image description here

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

Примечание: Это решение добавляет подпредставление к контроллеру навигации, и если вы собираетесь перейти к другому экрану отсюда вниз по навигационной панели, вы найдете это подпредставление для сохранения, удалите его, используя copyrightView.removeFromSuperView для viewDidDisappear во время выполнения segue.

6 голосов
/ 25 июня 2016

Поскольку UITableViewController является подклассом UIViewController, вам необходимо добавить желаемый вид в его суперпредставление.

Swift:
self.view.superview?.addSubview(viewTobeAdded)

Objective C:
[self.view.superview addSubview: viewTobeAdded];
6 голосов
/ 06 мая 2016

У меня была похожая проблема, и я решил ее, используя следующий код:

     [self.navigationController.view insertSubview:<subview> 
       belowSubview:self.navigationController.navigationBar];

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

6 голосов
/ 10 января 2011

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

Здесь есть несколько вариантов. Вы можете переопределить loadView и установить собственное представление и представление таблицы:

// note: untested
- (void)loadView {
    self.view = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
    self.view.backgroundColor = [UIColor whiteColor];

    UITableView *tblView = [[UITableView alloc]
        initWithFrame:CGRectZero
        style:UITableViewStylePlain
    ];

    tblView.autoresizingMask =
        UIViewAutoresizingFlexibleWidth |
        UIViewAutoresizingFlexibleHeight
    ;

    self.tableView = tblView;
    [self.view addSubview:tblView];
    [tblView release];
}

А затем, когда вам нужно добавить подпредставление, добавьте его ниже или выше self.tableView в зависимости от ситуации.

Другой вариант - просто создать подкласс UIViewController, который будет делать то, что вам нужно. UITableViewController честно говоря, не так уж много, и небольшая функциональность, которую он реализует, легко тиражируется. Есть статьи, такие как Воссоздание UITableViewController для увеличения повторного использования кода , которые объясняют, как сделать это довольно легко.

5 голосов
/ 10 января 2011

Пример Apple «iPhoneCoreDataRecipes» использует NIB для загрузки заголовка в UITableView. Смотри здесь :

4 голосов
/ 05 июня 2013

Я добавил изображение над таблицей.Я использовал этот код:

self.tableView.tableHeaderView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...