it-roy-ru.com

Представление модального View Controller скрывает панель навигации

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

[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];
    }
}
17
EmphaticArmPump

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

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

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

Правка

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

18
Michael Frederick

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

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

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

11
Priyank Ranka

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

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

[self.navigationController presentModalViewController:myVC animated:YES];
3
Bob Spryn
AddContactVC *addController =[self.storyboard instantiateViewControllerWithIdentifier:@"AddContactVC"];
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:addController];
[self presentViewController:navigationController animated:YES completion: nil];

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

1
Asad ali

Проверь это. Это документация 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

1
Parth Bhatt

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

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

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

1
Rajesh

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

0
Abo3atef

Эмпатич и Девин -

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

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

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

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

0
ravron

У 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
john.k.doe