Абсолютное позиционирование по tableView, просмотр иерархии и перерисовка - PullRequest
0 голосов
/ 07 апреля 2011

на главном экране моего проекта у меня есть TableView, с панелью навигации вверху и панелью инструментов внизу. Дело в том, что одна из кнопок на панели инструментов должна сдвинуть UISegmentedControl с панели инструментов. Я уже реализовал этот элемент управления в пользовательском UIView, НО, если я просто добавлю его в свой rootviewcontroller.view и вставлю его на место, он будет прокручиваться вместе с остальной таблицей, что нежелательно (хотелось бы, чтобы оно отображалось как расширение панели инструментов).

Итак, что мне делать? В rootViewController я делаю

self.filterView = [[FilterView alloc] initWithTarget:self.tableView reloadDataSelector:@selector(reloadData)];
[[self.view superview] addSubview:self.filterView];
[[self.view superview] bringSubviewToFront:self.filterView];

Я добавляю управляющее представление (self.filterView) к суперпредставлению моего представления, и это помещает его выше прокрутки табличного представления.

НО, теперь проблема. Как только tableView выходит из поля зрения (я выдвигаю другое представление на navigationController или, особенно, если приложение переходит в фоновый режим), это представление перестраивается, и мое представление контроллера перемещается в (0,0).

Дело в том, что, нажимая новые представления на навигационном контроллере, я могу управлять им, перемещая его в viewWillAppear и viewWillDisappear в моем rootViewController. Но когда приложение переходит в фоновый режим и возвращается, эти функции не вызываются.

Итак, есть ли способ

(а) предотвратить перемещение моего вида контроллера

(b) обнаружение непреднамеренного перемещения

(c) обнаружение прихода и ухода из фона из rootViewController

???

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

Спасибо !!

EDIT:

Чтобы добавить информацию, если я сделаю

NSLog(@"%@",[self.view superview]); 

//I get <UIViewControllerWrapperView: 0x61589d0; frame = (0 64; 320 372); autoresize = W+H; layer = <CALayer: 0x615d9c0>>

EDIT2: Полагаю, я мог бы сначала создать свою собственную оболочку UIView, загрузить в нее всю мою текущую иерархию представлений и поместить туда представление контроллера. Ребята, вы думаете, это стоило бы хлопот? не проще ли?

EDIT3: Закончилась возможность изменения моего rootViewController с UITableViewController на UIViewController, и программно добавлен tableView, как предложил Фил ниже. Теперь я могу управлять своим основным видом так, как мне нравится, и, поскольку я помещаю туда свое сегментированное представление управления, я могу управлять его позиционированием, в отличие от предыдущего, когда я размещал его в UIViewControllerWrapperView, который я не слишком уверен, кто контролирует или что это делает с его подпредставлениями.

Так что, просто из любопытства, кто-нибудь знает, почему UIViewControllerWrapperView, который оборачивал представление моего UITableViewController, перемещал мой UIView при возвращении из фона ??

Чтобы уточнить, установка была такой:

UIViewControllerWrapperView
  |
  |UITableView
  |Custom SegmentedControl UIView

1 Ответ

3 голосов
/ 07 апреля 2011

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

Однако причина, по которой выпредставление является прокруткой, потому что оно добавляется как подпредставление UITableView, который является подклассом UIScrollView.Когда прокручивается представление прокрутки, оно перемещает любые подпредставления вверх или вниз с помощью свойства contentOffset.По мере прокрутки UIScrollView он будет многократно размещать свои подпредставления.Поскольку табличное представление не знает о вашем настраиваемом подпредставлении, похоже, оно просто перемещает его в 0,0.

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

Очень легко дублировать функциональность UITableViewController, если вы беспокоитесь об этом.На самом деле это очень четко задокументировано.

Когда представление таблицы собирается появиться при первой загрузке, контроллер представления таблицы перезагружает данные представления таблицы.Он также очищает свой выбор (с анимацией или без нее, в зависимости от запроса) каждый раз, когда отображается представление таблицы.Класс UITableViewController реализует это в методе суперкласса viewWillAppear :.Вы можете отключить это поведение, изменив значение в свойстве clearsSelectionOnViewWillAppear.

В вашей реализации:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([self.tableView numberOfSections] == 0) {
        [self.tableView reloadData];
    } else {
        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];
    }
}

Когда появилось табличное представление, контроллер мигаетиндикаторы прокрутки табличного представления.Класс UITableViewController реализует это в методе суперкласса viewDidAppear:.

В вашей реализации:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.tableView flashScrollIndicators];
}

Он реализует метод суперкласса setEditing: animated: так, что еслипользователь нажимает кнопку Edit | Done на панели навигации, контроллер переключает режим редактирования таблицы.

В вашей реализации:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    [super setEditing:editing animated:animated];
    [self.tableView setEditing:editing animated:animated];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...