#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. Похоже, я не хочу его сохранять. В любом случае, теперь код работает. Большое вам спасибо