1

我在 Xcode 4.5 中,目标是 iOS6。序言:我有一个 libraryView(呈现视图控制器),带有一个包含搜索的弹出框。在显示搜索结果后,点击一行会关闭库并转到 entryView。这一切都很好。我的问题:关闭 entryView 并返回 libraryView 后,搜索弹出框仍然可见。我尝试了许多不同的方法来解决这个问题:我在搜索弹出框的 segue 中添加了一个通知观察者,从搜索控制器发布了一个通知,从 entryView 发布到位于 libraryView 中的以下方法。而且,是的,libraryView 确实有 addObserver 用于此方法:

- (void)searchComplete:(NSNotification *)notification
{
   NSLog(@"SearchPopover dismiss notification?");
   [_searchPopover dismissPopoverAnimated:YES];
}

我在测试中添加了...

if (_searchPopover.popoverVisible)
{
   [_searchPopover dismissPopoverAnimated:YES];
}

以viewDidLoad、viewWillAppear、viewWillDisappear、awakeFromNib...都在库中。我将 searchPopover 作为属性并尝试将其作为 ivar。我没有尝试过在 segue 之前或返回之后消除弹出窗口。

有人有想法么?帮助将不胜感激!!!

4

1 回答 1

2

我找到了解决这个问题的方法......在这个答案中找到了它: iOS Dismissing a popover that is in a UINavigationController

但是,还有一个额外的小步骤......更正答案中的错字并将“dismissPopover”方法更改为 NSNotification 方法。我为弹出框添加了一个 segue,这通常是没有必要的。不过,关键是将父级的弹出框定义设置为 UIStoryboardPopoverSegue。

然后,使用通知让父母知道它应该解雇。

从父视图:

- (void)viewDidLoad
{
    ... other loading code...

    [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(dismissSearch:) name:@"dismissSearch" object:nil];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SearchSegue"])
    {
        [segue.destinationViewController setDelegate:self];
        _searchPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    }
}

- (void)dismissSearch:(NSNotification *)notification
{
    NSLog(@"SearchPopover dismiss notification?");
    [_searchPopover dismissPopoverAnimated:YES];
}

在我的子视图(SearchView)中。理想情况下,它将位于 didSelectRowAtIndexPath 中。我发现它也可以在显示搜索项目的视图中工作,这是我通常放置 addObserver 的地方。在这种情况下,它是一个 postNotification ...

    [NSNotificationCenter.defaultCenter postNotificationName:@"dismissSearch" object:nil];

最后一点:我使用的是 IBAction,它在点击按钮时检查弹出框的可见性......显示或关闭。发现拥有这个以及其他方法会导致弹出框在点击按钮后立即关闭!注释掉 if/else 检查可见性解决了这个问题!

感谢 rdelmar 带领我走上这条道路!

于 2013-01-28T15:07:57.477 回答