Представление модального контроллера вида скрывает панель навигации - PullRequest
17 голосов
/ 12 августа 2011

У меня есть приложение на основе навигации с панелью навигации, но есть несколько случаев, когда вместо того, чтобы помещать контроллер представления в стек, мне нужно представить контроллер представления модально.Проблема состоит в том, что когда я отклоняю модальный контроллер представления, все функционирует как ожидалось, за исключением того, что панель навигации скрыта, и (родительское представление) было изменено, что является ожидаемым поведением согласно документам.Поэтому я решил, что могу просто вызвать встроенный метод, чтобы отобразить панель навигации.Я уже попробовал

[self.navigationController setNavigationBarHidden:NO];

, а также анимационную версию без успеха.

В документации говорится об этом в методе

presentModalViewController: animated:

в разделе обсуждения, гдеон говорит:

На устройствах iPhone и iPod touch представление modalViewController всегда отображается в полноэкранном режиме "и" Устанавливает свойство modalViewController для указанного контроллера представления.Изменяет размеры своего представления и присоединяет его к иерархии представлений. "Однако документы не подскажут мне, как отменить этот процесс после отклонения модального представления.

Кто-нибудь еще испытывал это инашел решение?

Редактировать: У меня такая же проблема, поэтому вместо того, чтобы задавать собственный вопрос, я спонсирую вознаграждение за этот вопрос. Это моя конкретная ситуация:

В моем случае я представляю средство выбора изображений в контроллере модального представления через контроллер навигации:

-(void) chooseImage {
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
        imagepicker = [[UIImagePickerController alloc] init];
        imagepicker.allowsEditing = NO;
        imagepicker.delegate = self;
        imagepicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagepicker.navigationBar.opaque = true;
        imagepicker.wantsFullScreenLayout = NO;

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {

            if (self.view.window != nil) {
                popoverController = [[UIPopoverController alloc] initWithContentViewController:imagepicker];

                [popoverController presentPopoverFromBarButtonItem:reset permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
            } else {}

        } else {
            [self.navigationController presentModalViewController:imagepicker animated:YES];   
        }
    }
}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [self.popoverController dismissPopoverAnimated:true];
    } else {
        [self.navigationController dismissModalViewControllerAnimated:YES];
    }
    //Save the image
}

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [self.popoverController dismissPopoverAnimated:true];
    } else {
        [self.navigationController dismissModalViewControllerAnimated:YES];
    }
}

Ответы [ 9 ]

18 голосов
/ 21 июня 2012

Убедитесь, что вы представляете и отклоняете modalViewController из UINavigationController, например:

// show
[self.navigationController presentModalViewController:vc animated:YES];
// dismiss
[self.navigationController dismissModalViewControllerAnimated:YES];

Если ваш контроллер представления фактически находится в стеке UINavigationController, то это правильный способ обработки представления и удаленияконтроллера модального вида.Если ваш UINavigationBar все еще скрыт, происходит что-то еще, и нам нужно увидеть ваш код, чтобы определить, что происходит.

Редактировать

Я скопировал вашкод в мое приложение и UIImagePickerController успешно представлены и отклонены, и UINavigationBar моего UINavigationController все еще был там.Я искренне верю, что проблема лежит в другом месте вашей архитектуры.Если вы загрузите zip с примером проекта, я посмотрю.

11 голосов
/ 16 октября 2012

Просто попробуйте следующий код, он будет работать

SettingsViewController *settings    =   [[SettingsViewController alloc] init];
UINavigationController *navcont = [[UINavigationController alloc] initWithRootViewController:settings];
[self presentModalViewController:navcont animated:YES];
[settings release];
[navcont release];

Нужно представить навигационный контроллер, чтобы иметь навигационную панель на представленном контроллере

3 голосов
/ 21 июня 2012

Я думаю, что видел такое поведение при представлении контроллера представления на неправильном VC. Вы звоните presentModalViewController на навигационном контроллере или отдельном VC?

Попробуйте позвонить из навигационного контроллера, если вы этого еще не сделали.

[self.navigationController presentModalViewController:myVC animated:YES];
1 голос
/ 22 июля 2015
AddContactVC *addController =[self.storyboard instantiateViewControllerWithIdentifier:@"AddContactVC"];
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];

у меня работает показывает панель навигации

1 голос
/ 22 июня 2012

Если вы представите контроллер в качестве модели, отобразится общий вид контроллера.

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

Это может быть полезно для вас.

1 голос
/ 12 августа 2011

Проверьте это. Это документация Apple под UIViewController. Ссылка на класс:

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

presentModalViewController:animated:
Presents a modal view managed by the given view controller to the user.

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
Parameters
modalViewController
The view controller that manages the modal view.
animated
If YES, animates the view as it’s presented; otherwise, does not.
Discussion
On iPhone and iPod touch devices, the view of modalViewController is always presented full screen. On iPad, the presentation depends on the value in the modalPresentationStyle property.

Sets the modalViewController property to the specified view controller. Resizes its view and attaches it to the view hierarchy. The view is animated according to the transition style specified in the modalTransitionStyle property of the controller in the modalViewController parameter.

Availability
Available in iOS 2.0 and later.

Надеюсь, это поможет вам понять, что скрытие всего вида вместе с контроллером навигации является поведением по умолчанию для модального вида, поэтому попробуйте поместить отдельную панель навигации в модальное представление для навигации.

Вы можете проверить это далее по этой ссылке

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

0 голосов
/ 09 июня 2014

Одно из лучших решений это использовать эту категорию MaryPopin https://github.com/Backelite/MaryPopin

0 голосов
/ 23 июня 2012

У Xcode есть шаблон, который очень близок к тому, что вы делаете. Исходя из результатов, я не думаю, что вы должны пытаться выполнить [self.navigationController presentModalViewController: vc] и [self.navigationController dismissModalViewControllerAnimated:], а скорее просто [self presentModalViewController:] и [self dismissModalViewControllerAnimated:.

Чтобы увидеть, как шаблон делает это для себя, вы можете использовать мастер нового проекта в xcode 4.3. возможно, это даст некоторые рекомендации:

Xcode new project wizard utility template

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

Теперь нажмите на цель и переключите цель развертывания на 4.3 (или 4.0, если хотите) для целей тестирования и переключитесь на ваше устройство или симулятор iOS 4.3.

наконец, замените следующий код в applicationDidFinishLaunching: withOptions: в созданном AppDelegate.m:

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPhone"
                                                                        bundle:nil] autorelease];
    } else {
        self.mainViewController = [[[MainViewController alloc] initWithNibName:@"MainViewController_iPad"
                                                                        bundle:nil] autorelease];
    }
    UINavigationController* navigationController
      = [[UINavigationController alloc] initWithRootViewController:self.mainViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    return YES;

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

(конечно, в iOS 5 с раскадровками то же самое может быть достигнуто с помощью модальных сегментов ... вот как я это сделал для приложений, которые я не поддерживаю для pre-5.0, которые представляют modalViewController таким образом.)

0 голосов
/ 21 июня 2012

Эмфатик и Девин -

Когда я начал читать документы Apple, чтобы ознакомиться с проблемой, я заметил, что используемый вами метод, presentModalViewController:animated:, кажется устаревшим в пользу presentViewController:animated:completion:. Возможно, вам следует попробовать использовать этот метод.

Для вашего удобства посмотрите сами:

presentModalViewController: анимированный: ссылка

Я попытаюсь составить программу быстрого тестирования, чтобы проверить, действительно ли то, что я сказал выше, действительно верно. Но попробуйте - может быть, это поможет!

...