UIPopoverController не перемещается в исходное положение после скольжения клавиатуры вниз - PullRequest
8 голосов
/ 21 августа 2010

Я показываю поповер в iPad с панелью навигации UIN. Во втором представлении у меня есть UISearchController, который может отображать клавиатуру. Клавиатура толкает всплывающее окно вверх, и это нормально, однако, если я теперь нажму кнопку «назад» на панели навигации UIN, она отклонит клавиатуру, что нормально, но поповер не сдвинется обратно в исходное положение. Кто-нибудь знает, как это исправить? Спасибо!

Ответы [ 3 ]

9 голосов
/ 16 сентября 2010

Хорошо, так что я на самом деле понял (я верю), что задал твой вопрос ... и на всякий случай, если кто-нибудь наткнется на это из Google, я подумал, что отвечу, как я это сделал.Это похоже на хакерскую работу, но я не смог найти другого способа сделать это.

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

    [aTextField resignFirstResponder];
[[NSNotificationCenter defaultCenter] postNotificationName:@"movePopups" object:nil];

Затем, вернувшись к контроллеру домашнего экрана, который управляет UIPopover, я добавил слушателя:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(movePopUpToRightLocation)
                                             name:@"movePopups"
                                           object:nil];    

внутри init.Не забудьте удалить слушателя из вашего dealloc для хорошей практики программирования:

[[NSNotificationCenter defaultCenter] removeObserver:self];

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

-(void)movePopUpToRightLocation {
NSLog(@"move pop up to right location");
if (morePopUp) {
    UIBarButtonItem *barButtonItem = (UIBarButtonItem *)[[bottomToolBar items] objectAtIndex:0];
    [morePopUp presentPopoverFromBarButtonItem:barButtonItem
                      permittedArrowDirections:UIPopoverArrowDirectionDown
                                      animated:YES];            
}   

}

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

Надеюсь, это поможет!

1 голос
/ 18 января 2012

Вы также можете зарегистрироваться для UIKeyboardDidHideNotification где-нибудь в инициализаторе.

[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movePopoverBack:) name:UIKeyboardDidHideNotification object:nil];

Этот код перемещает поповер назад:

- (void)movePopoverBack:(id)sender {
    if ([self.settingsPopoverController isPopoverVisible]) {
        [self performSelector:@selector(hidePopover) withObject:nil afterDelay:0.1];
        [self performSelector:@selector(movePopoverBack) withObject:nil afterDelay:0.5];
    }
}

- (void)hidePopover {
    [self.settingsPopoverController dismissPopoverAnimated:YES];
}

- (void)movePopoverBack {
    [self.settingsPopoverController
     presentPopoverFromBarButtonItem:self.bottomToolbar.settingsButton
     permittedArrowDirections:UIPopoverArrowDirectionDown
     animated:YES];  
}   

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

0 голосов
/ 04 апреля 2012

После того, как вы нажали кнопку «Назад», вы должны вручную вызвать resignFirstResponder для поля поиска (например, внутри viewDidDisappear).

Это должно помочь, но проблема все еще будет воспроизводиться под iOS 4, когда устройство находится в альбомной ориентации с кнопкой Hmeme на левой стороне

...