Subviews не загружаются из NIB с initWithNibName - PullRequest
2 голосов
/ 18 июня 2009

У меня есть код ниже в моем RootViewController (который является UITableViewController). Этот код выполняется при нажатии кнопки на панели навигации, а затем (в симуляторе) отображается следующий вид. Однако подпредставления (UITextLabels, UIButtons), которые отображаются в представлении, управляемом TripDetailsController, не отображаются. Кроме того, в панели навигации в верхней части экрана кнопка «назад» в исходном виде не отображается, но когда я нажимаю на левой стороне панели навигации, она переходит обратно в исходный вид.

  • TripDetailsController.view связан с TripDetailsView (UIView) в Интерфейсном Разработчике
  • tdController имеет значение, поэтому выглядит так, как будто оно загружено
  • TripDetailsController находится в отдельном файле NIB
  • Использование iPhone SDK 2.2.1 (пока не 3.0)

Код:

 TripDetailsController *tdController = [[TripDetailsController alloc]
                  initWithNibName:@"TripDetailsController" bundle:nil];
 [self.navigationController pushViewController:tdController animated:YES];
 [tdController release];

В классе TripDetailsController я добавил метод viewDidLoad следующим образом:

Код:

- (void)viewDidLoad {
  [super viewDidLoad];
  self.navigationItem.title = @"Reis Details";    

  NSLog(@"Subviews: %@", self.view.subviews);
  UILabel *l = [self.view.subviews objectAtIndex:0];
  NSLog(@"Subview 0 bounds: %@", l.bounds);
}

Приведенные ниже сообщения журнала показывают, что подпредставления существуют, но границы также не установлены:

код:

6/18/09 Jun 18, 2009   10:06:00 PM ReisAdvies[11226] Subviews: (
    <UILabel: 0x56f250>,
    <UILabel: 0x56f5a0>,
    <UILabel: 0x56f6b0>,
    <UILabel: 0x56f780>
) 
6/18/09 Jun 18, 2009   10:06:00 PM ReisAdvies[11226] Subview 0 bounds: (null) 

В Интерфейсном Разработчике на вкладке «Размер метки» отображаются значения для X / Y / W / H. Такое ощущение, что мне нужно вызвать его для выполнения некоторых действий с макетом, но вызов layoutSubviews в viewDidLoad () не помогает. Любые идеи, в чем может быть проблема здесь?

Ответы [ 5 ]

2 голосов
/ 19 июня 2009

Нашел решение, в Интерфейсном Разработчике:

  1. В файле NIB я не включил UIWindow, поэтому я добавил UIWindow в файл NIB и подключил выход TripDetailsController.view к недавно добавленному UIWindow.
  2. Свойство представления «Владелец файла» подключено к TripDetailsView (UIView)
  3. Для класса «Владелец файла» установлено значение UIViewController

Теперь все работает как положено.

Не уверен на 100%, если это «способ» сделать это, но, по крайней мере, мне кажется, что он работает нормально.

1 голос
/ 18 июня 2009

Первое, что я заметил в вашем коде, это то, что вы вызываете функцию, подобную:

tdController.loadView;

Насколько я знаю, это невозможно сделать в объективе-c. Вы должны назвать это как:

[tdController loadView];

Кроме того, где вы делаете всю свою инициализацию? В «loadView», в «viewDidLoad»?

Попробуйте добавить контроллер на экран с чем-то вроде этого (нажмите View вместо ViewControllers):

[self.view insertSubview:tdController.view atIndex:0];

Приведенный выше код предполагает, что он запускается внутри другого подкласса UIViewController, который загружает представление вашего контроллера в его собственное представление как подпредставление.

1 голос
/ 18 июня 2009

Также в панели навигации вверху экрана, кнопка «назад» для оригинальный вид не отображается, но когда я нажимаю на левой стороне панель навигации это делает переход назад к исходному виду.

Вы установили название для элемента навигации?

Например, в TripDetailsController viewDidLoad

self.navigationitem.title = @"trip detail";
0 голосов
/ 27 июля 2009

Вот что у меня сработало ...

Вычеркнул Window и ViewControl из XIB и сделал владельцем файла мой класс ViewCOntroller, а затем связал представление владельца файла с моим представлением.

Сделал загрузку с initWithNibName ...

Новичок в iPhone Dev и немного озадачен тем, сколько способов я могу повеситься в IB.

0 голосов
/ 18 июня 2009

То, как вы переходите к подпредставлению, в целом выглядит нормально для меня. Единственное, что я хотел бы упомянуть, это ваше сообщение [TripDetailController -loadView]. Я никогда не делал что-то подобное. Normall Я просто передаю некоторую информацию о состоянии в зависимый контроллер, прежде чем добавить ее в UINavigationController, используя стандартные механизмы (а именно viewDidLoad) для инициализации логики контроллера.

Получаете ли вы сообщение -viewDidLoad? Ваш контроллер работает и работает в этот момент?

Возможно, это небольшая проблема / тип проводки где-то в вашем проекте.

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