也许您需要使用addChildController 将弹出窗口作为子控制器添加到您从中显示它的控制器中,这样它就不会从视图层次结构中分离出来?
您也可以尝试:另一种选择:
[self.parentViewController presentViewController:picker animated:YES completion:nil];
我在另一个线程上注意到了这一点作为解决方案。 Warning :-Presenting view controllers on detached view controllers is discouraged
在你的情况下,parentViewController 很可能是 nil。
查看代码后编辑:
查看代码后,问题似乎如下:
1) 弹出机制是使用 UIViewController 的实例来创建布局,但您实际上根本没有使用视图控制器。弹出机制 (showInView:withImage:withMessage:animated:) 是从控制器中提取视图并将其添加到请求弹出的控制器的视图层次结构中。因此,使用此弹出控制器实例中调用[self presentViewController...] 的代码会从实际上未使用的控制器中呈现模态控制器。我相信这就是错误的来源。您需要从原始控制器执行所有警报和模式演示,或者传入控制器以使用。
2) 原文章中提到因为只用到了控制器的容器视图,所以在创建的时候需要保持对它的强引用。所以你应该有:
self.popViewController = [[PopUpViewController alloc] initWithNibName:@"PopUpViewController" bundle:nil];
解决方案:
我将扩展showInView... 方法以传入拥有正在拼接弹出窗口的视图的控制器。然后使用此控制器呈现任何模态控制器。所以改变:
- (void)showInView:(UIView *)aView withImage:(UIImage *)image withMessage:(NSString *)message animated:(BOOL)animated
到
- (void)showInController:(UIViewController *)aController inView:(UIView *)aView withImage:(UIImage *)image withMessage:(NSString *)message animated:(BOOL)animated
将控制器引用存储在PopUpViewController 类中的属性中,然后使用该属性调用presentViewController...