在didSelectRow跳转到另一个视图后弹出窗口不会消失



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

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

我添加了test…

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

给viewDidLoad, viewWillAppear, viewWillDisappear, awakeFromNib…都在图书馆里。我有搜索弹窗作为一个属性,并尝试它作为一个变量。我没有尝试过在segue之前或返回之后解散弹窗。

有人有什么想法吗?帮助将非常感激!!

我找到了一个解决这个问题的方法…我找到了这个答案:iOS在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中。我发现它在视图的segue中也能工作,它将显示搜索项,这是我通常放置addObserver的地方。在本例中,它是一个postNotification…

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

最后一点:我使用了一个IBAction,当点击按钮时检查弹出窗口的可见性…显示或取消。发现有了这个以及其他方法,导致弹出窗口在点击按钮后立即解散!注释掉if/else检查的可见性解决了这个问题!

感谢rdelmar带领我走这条路!

最新更新