键盘滑回后,UIPopoverController不会移动到原始位置

时间:2010-08-21 10:03:48

标签: ipad uipopovercontroller

我在iPad上用UINavigation栏显示一个popover。在第二个视图中,我有一个可以显示键盘的UISearchController。键盘向上推动弹出窗口,这很好,但是如果我现在按下UINavigation条上的“后退”按钮它会解除键盘,这很好,但弹出窗口不会滑回原来的位置。有谁知道如何解决这个问题?谢谢!

3 个答案:

答案 0 :(得分:9)

好的,所以我实际上想通了(我相信)你的问题是什么......以防万一有人从谷歌那里偶然发现,我想我会回答我是怎么做到的。这感觉就像一个黑客工作,但我还没有找到任何其他方法来做到这一点。

在调出键盘的控制器中,只要键盘解除,我就会发布通知:

    [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)

您也可以在初始化程序中的某处注册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];  
}   

没有延迟,我没​​有让它工作,但这对我目前的项目来说似乎是可以接受的。希望它可以帮到某人。

答案 2 :(得分:0)

按“返回”按钮后,您应该为搜索字段手动调用resignFirstResponder(例如在viewDidDisappear内)。

这应该会有所帮助,但是当设备处于横向方向时,问题仍将在iOS 4下重现,并且左侧是“ome”按钮