Как создать UIViewController с UINavigationController с помощью Интерфейсного Разработчика? - PullRequest
3 голосов
/ 05 января 2011

В моем приложении для iOS я хочу предоставить представление настроек.«presentModalViewController» работает очень хорошо:

ViewSettings *controller = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self.navigationController presentModalViewController:navController animated:YES];      
[controller release];
[navController release];

К сожалению, мне нужно изменить мой работающий код и создать ViewSettings, включая UINavigationController, в Интерфейсном Разработчике.Зачем?Длинная история, я объясню это в конце этой темы ...

Я пытаюсь перетащить UINavigationController в мои ViewSettings и создать IBOutlet для доступа к нему в моем классе.Я отдаю этот контроллер "presentModalViewController", но приложение упало ...

Что я делаю не так?


[EDIT]

Сообщение об ошибке: GDB: Программа получила сигнал: "SIGABRT".
Ошибка происходит впоследняя строка этого кода:

ViewSettings *viewSettings = [[ViewSettings alloc] initWithNibName:@"ViewSettings" bundle:nil];
UINavigationController *navController = viewSettings.navigationController;
UINavigationBar *navBar = navController.navigationBar;
OwnNavigationBar *ownNavBar = (OwnNavigationBar *)navBar;
[ownNavBar drawHeaderImage:YES];
[self.navigationController presentModalViewController:navController animated:YES];

Подробная ошибка: Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение попыталось представить нулевой контроллер модального представления для цели.»

[/ EDIT]


[EDIT2]
Спасибо за вашу помощь!Да, navigationController - это ноль ... Я думаю, что я добавил UINavigationController неправильно ... Я поместил его в это окно, потому что не было возможности поместить его непосредственно в мое представление: alt text
Как мнедобавить UINavigationController правильно?
[/ EDIT2]


PS: Почему я должен использовать IB?(Вы можете пропустить это ...)

Мне нужно фоновое изображение в моей UINavigationBar.Моя первая попытка была:

UIImage *image = [UIImage imageNamed: @"header.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.navigationController.navigationBar addSubview:imageView];
[self.navigationController.navigationBar sendSubviewToBack:imageView];

Но в некоторых случаях заголовок или кнопка UIBarButton не видны!Я много пробовал, например, устанавливает «тег» представления и sendSubviewToBack в каждом представлении, но безуспешно.Это очень раздражающая ошибка!

Моя вторая попытка состояла в том, чтобы создать категорию и перезаписать метод drawRect:

@implementation UINavigationBar(MyNavigationBar)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"header.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

Но теперь все мои UINavigationBars имеют фоновое изображение, и яне могу деактивировать это.Проблема заключается в том, что для «ViewSettings» требуется фоновое изображение, но следующие push-представления не нужны.

К сожалению, невозможно установить свойство в категории или вызвать [super drawRect: rect] дляизбегайте рисования изображения.

Моя последняя попытка - написать собственный UINavigationBar

@interface OwnNavigationBar : UINavigationBar {
    BOOL _drawHeaderImage;
}

Теперь я могу управлять методом drawRect !!БОЛЬШОЙ !!

- (void)drawRect:(CGRect)rect {
    if (_drawHeaderImage) {
        UIImage *image = [UIImage imageNamed: @"header.png"];
        [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    }
    else {
        [super drawRect: rect];
    }
}

Но я отмечаю рано ... :-( Невозможно установить собственную UINavigationBar в UINavigationController !!! "navigationBar" в UINavigationController - свойство только для чтения! AAAAHHHHHHHHHH!

У меня есть один последний шанс: в Интерфейсном Разработчике можно дать UINavigationController собственный UINavigationBar !! ДА! Я ПОЛУЧИЛ ЭТО !!: -)

Я настроил его вмой MainWindow_iPhone.xib, и он прекрасно работает!Теперь я должен реализовать это для моих ViewSettings, потому что это (модальное) представление нуждается в новом UINavigationController.

PS: Может быть, кто-то может отправить эту ветку в Apple, это все очень раздражающие обстоятельства иошибки: - (

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Когда вы запускаете контроллер вида из кончика, он фактически не загружает кончик сразу, поэтому viewSettings.navigationController по-прежнему равен нулю. При первом обращении к свойству view перо будет загружено.

Обновление

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

UINavigationController *navController = [[[NSBundle mainBundle] loadNibNamed:@"ViewSettings" owner:self options:nil] objectAtIndex:1];

Я использовал объект с индексом 1, потому что на вашем скриншоте есть табличное представление, которое, я думаю, будет индексом 0.

2 голосов
/ 05 января 2011

Было бы полезно, если бы вы показали содержимое вашего nib-файла, потому что я подозреваю, что viewSettings.navigationController - ноль.navigationController - это свойство всех UIViewControllers, которое предоставляет вам родительский контроллер представления навигации, если таковой существует.Похоже, вы никогда не добавляли контроллер вида viewSettings в стек контроллеров представления контроллера навигации.

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