Подтвердить что ты не робот

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

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

[self.navigationController setNavigationBarHidden:NO];

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

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

presentModalViewController: animated:

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

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

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

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

В моем случае я представляю Image Picker в Modal View Controller над контроллером навигации:

-(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];
    }
}
4b9b3361

Ответ 1

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

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

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

Edit

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

Ответ 2

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

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

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

Ответ 3

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

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

[self.navigationController presentModalViewController:myVC animated:YES];

Ответ 4

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

Ответ 5

Если вы представляете контроллер в качестве модели, View View будет отображаться в общем виде.

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

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

Ответ 6

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

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

Ответ 7

Emphatic и Devin -

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

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

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

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

Ответ 8

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

чтобы увидеть, как шаблон делает это для вас, вы можете использовать новый мастер проекта в 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;

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

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