我遇到弹出窗口问题。如果我点击一个单元格,我将加载一个弹出框以选择更多细节。一切正常,但当我再次按下我的手机时,我每次都收到以下消息:
警告:尝试在MainTableViewController上呈现ModalTableViewController ... ...已经呈现(null)
如果我点击另一个单元格,我将不会收到此警告。只有再次点击同一行时才会显示。
我尝试了很多东西,但我无法解决这个问题。我像这样加载我的popover:
var popover: UIPopoverController!
var popoverContent: ModalTableViewController!
在我的手机上点按:
popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("ModalTableViewController") as ModalTableViewController
popoverContent.selectedQuestionID = indexPath!.row
popover = UIPopoverController(contentViewController: popoverContent)
popover.delegate = self
popover.presentPopoverFromRect(currentCell.LabelCellTitle.frame, inView: currentCell.LabelCellTitle.superview, permittedArrowDirections: UIPopoverArrowDirection.Left, animated: true)
并解雇
func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {
popover.dismissPopoverAnimated(false) // just to check
self.popover = nil
self.popoverContent = nil
}
有什么想法吗?
编辑:
如果我查看:
if(self.popoverContent == nil) {
在打开它之前,我会发现当我再次敲击同一个细胞时它不是零。
再次编辑:
如果我使用一些不同的设置创建它,我会遇到同样的问题:
自定义1x1px按钮。用popue连接popover。在单元格上点击移动按钮到单元格并打开弹出窗口。
因此没有用于打开弹出窗口的代码,只有故事板编辑器。
如果我再次点击相同的弹出窗口,我会得到相同的错误消息(有时)。
答案 0 :(得分:137)
我有这个问题,因为我试图从内部执行segue / present:
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
我把它改为:
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
它修好了!
答案 1 :(得分:55)
我还没有快速,但是对于Objective-C,我最终在performSelector调用中包装了presentViewController调用。
-(void) present
{
[self performSelector: @selector(ShowModalTableViewController) withObject: nil afterDelay: 0];
}
-(void) ShowModalTableViewController
{
[self presentViewController: ctrlModalTableViewController animated: true completion: nil];
}
答案 2 :(得分:52)
这也可以:
dispatch_async(dispatch_get_main_queue(), ^ {
[self presentViewController:vc animated:YES completion:nil];
});
答案 3 :(得分:5)
在弹出窗口上呈现任何内容似乎都是如此。之前所有响应都起作用的原因可能是因为在弹出窗口(或活动表或类似内容)被取消之前所采取的任何操作都会发生。
如果可以,请先尝试解除弹出窗口,然后展示你的模态。
答案 4 :(得分:4)
这实际上是 iPad 上的 iOS 8 问题,并且不会出现在8以下的 iOS 中。可以在那里提出一个条件:
if ([controller respondsToSelector:@selector(popoverPresentationController)])
{
// iOS8
controller.popoverPresentationController.sourceView = self.view; // or any of your UIiew
}
但是考虑到史蒂夫的观点(https://stackoverflow.com/a/26380194/362310)下面的代码更改。
答案 5 :(得分:4)
轻松将此代码段添加到主uiviewcontroller的ViewDidLoad()
definesPresentationContext = true
答案 6 :(得分:3)
例如,如果在新视图控制器演示调用时显示UIActionSheet,则会发生这种情况 这段代码适合我
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[controller presentViewController:modalViewController animated:YES completion:NULL];
}];
答案 7 :(得分:1)
对我来说,这发生在我将两个UIBarButton项目作为NavigationItem的一部分并且两者都有一个触发的segue来打开视图作为弹出窗口时 - 使用它们自己的控制器。当点击另一个BarButtonItem时,一个弹出窗口不会自动关闭。然而,当我在弹出窗口外的其他地方敲击时,它会解雇。
我最终重写了UINavigationController并添加了presentViewController:animated:completion
/*
* Workaround for apparent bug in iPad that popover does not automatically dismiss if another bar button item is pressed
*/
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
/*
* Make sure this runs in the main queue
*/
dispatch_async(dispatch_get_main_queue(), ^ {
if (
[self.presentedViewController isKindOfClass:[ViewController1 class]]
|| [self.presentedViewController isKindOfClass:[ViewController2 class]]
|| [self.presentedViewController isKindOfClass:[ViewController3 class]]
|| [self.presentedViewController isKindOfClass:[ViewController4 class]]
) {
[self dismissViewControllerAnimated:YES completion:^{
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
}];
}
else {
[super presentViewController:viewControllerToPresent animated:flag completion:completion];
}
});
}
我认为dispatch_async(dispatch_get_main_queue(), ^ {})
并非真的有必要,我只是将其作为预防措施添加。
答案 8 :(得分:0)
在我的情况下,我不小心将我的按钮同时链接到IBAction
和Storyboard Segue
种类Present As Popover
。我要解决的问题是删除我的按钮的Touch Up Inside
事件链接到IBAction
并仅使用Storyboard Segue
。