загрузите файл .xib и отобразите его

#iphone #objective-c #interface-builder #nib

#iPhone #objective-c #конструктор интерфейса #перо

Вопрос:

Я пытаюсь отобразить «Страницу о программе» в своем приложении при нажатии кнопки, но когда я нажимаю UIButton, вызывается NSLog (@»Нажата кнопка»), но представление не загружается. Вот мой код:

 - (IBAction)pushAbout {
    NSLog(@"Button pressed");
    AboutView * aboutView = [[AboutView alloc] initWithNibName:@"AboutView" bundle:nil];
    [self.navigationController pushViewController:aboutView animated:YES];
    [aboutView release];
}
  

Я видел этот код в примере, но он был вызван в UITableViewController вместо обычного контроллера UIView.

Файлы класса «AboutView» были созданы как подкласс UIViewController. Они были созданы и оставлены нетронутыми

Комментарии:

1. Есть ли файл AboutView.xib в вашем пакете?

2. Да, он был добавлен вместе с AboutView.m и AboutView.h и содержит только метку

3. Ничего не происходит? Или отображается только белый вид? Правильно ли добавлен файл AboutView.xib в целевой файл? А вы сохранили свой файл xib? Иногда я редактирую свой файл xib и забываю сохранить…

4. Ничего не происходит. Просмотр не отображается. Похоже, что код просто игнорирует загрузку представления. Чего можно добиться, добавив файл .xib в целевой файл?

5. Откройте Target -> Копировать ресурсы пакета, есть ли ваш файл xib в этом списке? Можете ли вы поставить точку останова в своем действии и посмотреть, равен ли aboutView нулю после инициализации? Если значение не равно нулю, попробуйте представить его как modalviewcontroller, пожалуйста.

Ответ №1:

Предположение: ваш view отсутствует в UINavigationController, следовательно

 self.navigationController
  

на самом деле nil , и ничего не происходит.

Решением было бы поместить основной вид в навигационный контроллер и добавить вид навигационного контроллера в главное окно вашего приложения.

Простой способ сделать это:

В делегате вашего приложения измените

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}
  

Для

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions
(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    UINavigationController* navController = [[UINavigationController alloc] 
        initWithRootViewController:self.viewController];

    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];
    return YES;
}
  

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

Комментарии:

1. Я совсем новичок в Obj-C. Есть какой-нибудь учебник, как это сделать? Редактировать: self — это MainViewController, тот, который содержит все выходы и действия моих кнопок

2. Спасибо, но вышеприведенное сработало достаточно хорошо, чтобы я мог его использовать. В любом случае, еще раз спасибо

Ответ №2:

Да, у вас нет установленного UINavigationController.

Добавить

 NSLog(@"nav? %@", self.navigationController); 
  

для вашего действия, и вы увидите, что он сбрасывает (null).

Однако файл AboutView.xib отлично работает, если вы введете этот код:

 [self presentModalViewController:aboutView animated:YES];
  

вместо

 [self.navigationController pushViewController:aboutView animated:YES];
  

Отобразится представление. В вашем сжатом примере файл AboutView.xib не содержал метки, поэтому не удивляйтесь, если это окажется белой страницей.

Вы можете отклонить представленный модальный вид, используя

 [self dismissModalViewControllerAnimated:YES];
  

в вашем AboutViewController.

Чтобы получить доступ к UINavigationController, я предлагаю создать приложение с шаблоном приложения на основе навигации.

Комментарии:

1. Похоже, я не хочу его сохранять. В любом случае, теперь код работает. Большое вам спасибо