我在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带领我走这条路!