Контроллер модального вида не откажется от себя - PullRequest
33 голосов
/ 02 июля 2011

Что я делаю:

В моем приложении я представляю контроллер модального представления (содержащий настройки приложения), используя следующий код:

    optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentModalViewController:optionsViewController animated:YES];

Этот переход просто свернет нижнюю часть представления, чтобы выставить несколько настроек.(См. Пример приложения «Карты».) Когда вы нажимаете на верхнюю половину страницы, где исходный вид все еще есть, но отображается серым цветом, контроллер модального представления автоматически отключается (обработано ОС, я не сделал »код для этого).

-

Что не работает:

Это нормально работает в iOS 4 (мое приложение в настоящее время находится в приложенииХранить по факту).Но в iOS 5 похоже, что Apple изменила поведение этого перехода, и контроллер представления больше не отключается.Я пытаюсь повторить поведение, которое раньше обрабатывалось ОС, но не могу понять, как это сделать.

-

Что я пробовал:

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

Кроме этого я застрял.Как мне повторить, как это работало изначально (или я делал это неправильно с самого начала!).Любая помощь очень ценится!

Ответы [ 6 ]

71 голосов
/ 08 июля 2011

Чувак, я столкнулся с той же проблемой ... и вот что я нашел об использовании parentViewController:

Обратите внимание, что с 5.0 это больше не вернет представление представления контроллер.

Это было написано в заголовочном файле UIViewController ...

Я использую ShareKit, и modalViewController отлично работал в iOS4, но в iOS5 он просто не исчезнет сам! Это потому, что в своем коде они используют:

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

и parentViewController вернет nil, поскольку это модальный представленный контроллер представления ...

При поиске решения я нашел ваш вопрос .. Итак, я решил исправить это сам: P

Я изменил предыдущую строку следующим образом:

    [currentView dismissModalViewControllerAnimated:YES];

Работает как шарм.


РЕДАКТИРОВАТЬ: В зависимости от того, как вы интерпретируете исходный вопрос, есть два ответа. Вот второй:

В iOS5 кажется, что модальный контроллер отключается только при нажатии на локон, но не выше локона или фона. В iOS5, чтобы фактически заставить модальное представление отклоняться при нажатии на фон или над завитком, я добавил следующий код в контроллер, чтобы прослушивать нажатия на модальном представлении, но игнорировать нажатия на кнопки. Это должно имитировать поведение в предыдущей версии iOS при работе с модальным контроллером с завитком страницы.

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    tap.delegate = self;          
    [backgroundView addGestureRecognizer:tap];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    //change it to your condition    
    if ([touch.view isKindOfClass:[UIButton class]]) {      
       return NO;
    }
    return YES;
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    [self dismissModalViewControllerAnimated:YES];
}
15 голосов
/ 02 июля 2011

Какой код вы используете, чтобы закрыть модальный контроллер вида?Я видел такой код:

[self.parentViewController dismissModalViewControllerAnimated: YES];

, который работает не во всех версиях ОС.Однако это:

[self dismissModalViewControllerAnimated: YES];

следует.

1 голос
/ 13 октября 2011

У меня была такая же проблема, также влияет на тех, кто использует:

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

Я исправляю это с помощью Обозревателя, добавляя туда, где у вас было отклонение:

[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];

И это в родительском контроллере родительского представления:

// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];

//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
   [self dismissModalViewControllerAnimated:YES];
}

// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];
0 голосов
/ 01 ноября 2011

В iOS5 кажется, что модальный контроллер отключается только при нажатии на локон, но не выше локона или фона. В iOS5, чтобы фактически заставить модальное представление отклоняться при нажатии на фон или над завитком, я добавил следующий код в контроллер, чтобы прослушивать нажатия на модальном представлении, но игнорировать нажатия на кнопки. Это должно имитировать поведение в предыдущей версии iOS при работе с модальным контроллером с завитком страницы.

- (void)viewDidLoad
{
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    tap.delegate = self;          
    [backgroundView addGestureRecognizer:tap];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    //change it to your condition    
    if ([touch.view isKindOfClass:[UIButton class]]) {      
       return NO;
    }
    return YES;
}

- (void)handleTap:(UITapGestureRecognizer *)sender {
    [self dismissModalViewControllerAnimated:YES];
}
0 голосов
/ 22 октября 2011

Спасибо, ребята, это сэкономило мне много времени. Я только что заметил, что методы presentModalViewController и dismissModalViewController устарели в соответствии с исходным кодом для UIViewControoler.h. Существуют альтернативные методы presentViewController и dismissViewController.

0 голосов
/ 13 октября 2011

Похоже, что это работает на (теперь окончательная версия) ios 5.

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

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

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