Добавление подпредставления UIView к одному контроллеру табличного представления в стеке навигации - PullRequest
0 голосов
/ 15 октября 2010

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

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

- (void)viewDidLoad {
      [super viewDidLoad]

      UIView *detailView = [[UIView alloc] initWithFrame:CGRectMake(0, 392, 320, 44)];
      detailView = [UIColor redColor];
      [self.navigationController.view addSubview:detailView];
      [detailView release];
}

Проблема этого подхода заключается в том, что после загрузки UIView во второй контроллер представления он остается загруженным и отображается в контроллерах третьего и корневого представления. Я пробовал различные методы удаления UIView, в том числе установил для detailView значение nil в viewDidUnload, вызвав removeFromSuperview в didSelectRowAtIndexPath (который удалил представление из всего стека).

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

Очевидно, что добавление этого подпредставления к контроллеру навигации не лучший способ сделать то, что я хочу, но я не знаю, куда идти дальше.

Ответы [ 3 ]

2 голосов
/ 15 октября 2010

Мне не нравится подход. Вы должны поместить свое табличное представление в другое представление и соединить свое подробное представление в этом представлении.

Несмотря на это, я думаю, что вы можете удалить свое представление в viewWillDisappear методе вашего контроллера представления. Я также заметил, что вы не сохранили свою detailView как частную переменную, что вам следует делать, потому что вам нужно ссылаться на нее при удалении позже (мне все еще интересно, как вы это сделали.)

Обратите внимание, что viewDidUnload вызывается в случае выгрузки вида (т.е. освобождения от контроллера), поэтому он не связан с навигацией.

2 голосов
/ 15 октября 2010

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

Вы хотите, чтобы SecondViewController был UIViewController, который реализует UITableViewDelegate и UITableViewDataSource и чье представлениеизлагает UITableView и UIView, которые вы хотите использовать для своего стационарного «нижнего колонтитула» в своем собственном главном UIView.

Помогает помнить, что UITableViewController в конечном итоге является просто удобством для создания контроллера представления, представление которогополностью состоит из UITableView.

Во всяком случае, вместо попытки вставить кучу этого кода в этот ответ, вы можете просмотреть его (или svn co) из этого репозитория svn только для чтения .

РЕДАКТИРОВАНИЕ (теперь, когда уже не полночь, ввод кода / объяснения непосредственно в ответ):

Для контроллера, который нужно поместить в стек навигации, которыйнужен нижний колонтитул для создания нового класса на основе UIViewController (НЕ устанавливайте флажок «UITableViewController subclass» во временнойпоздний диалог выбора).

Добавьте переменные экземпляра для UITableView и UIView, которые должны быть дополнительным видом снизу.

@interface SecondViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
    UITableView* tableView;
    UIView* customFooterView;
}
@property (nonatomic,retain) IBOutlet UITableView* tableView;
@property (nonatomic,retain) IBOutlet UIView* customFooterView;
@end

В IB добавьте UITableView и UIView длясуществующее корневое представление для контроллера и раскладывайте их по желанию (вероятно, стоит также изменить параметры авторазмера, если ваше приложение можно использовать как в альбомной, так и в портретной ориентации).Подключите два представления к выходам, определенным для них в «Владельце файла», а также убедитесь, что вы подключили свойства UITableView's делегата и dataSource к «Владельцу файла».

Затем просто реализуйтеПротоколы UITableViewDelegate и UITableViewDataSource, соответствующие вашему приложению.

Если вы хотите выложить весь вид «нижнего колонтитула» в IB, то продолжайте.В противном случае вы можете легко добавить элементы программным способом в viewDidLoad (и не забудьте разорвать его в viewDidUnload).

1 голос
/ 15 октября 2010

Не уверен, какое поведение вы ищете, но попробуйте один из них:

  • Назначьте detailView для свойства tableFooterView представления таблицы во втором VC.

  • Уменьшите высоту табличного представления и добавьте detailView в self.view.

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