UIPopoverController presentPopoverFromRect 崩溃

Posted

技术标签:

【中文标题】UIPopoverController presentPopoverFromRect 崩溃【英文标题】:UIPopoverController presentPopoverFromRect crashes 【发布时间】:2012-08-30 08:56:20 【问题描述】:

我正在尝试在屏幕上的某处创建一个简单的弹出框,但由于某种原因,它一直在崩溃。 它没有给我任何错误(僵尸对象已启用)

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
view.backgroundColor = [UIColor redColor];
viewController.view = view;

UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:viewController];
[popover presentPopoverFromRect:CGRectMake(0, 0, 100, 100) inView:self.view.superview permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

我只是想在随机位置创建一个弹出框,这不可能吗?

编辑: 也试过这样

@property (nonatomic, retain) UIPopoverController *popover;

@synthesize popover = _popover;

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];

_popover = [[UIPopoverController alloc] initWithContentViewController:viewController];
_popover.delegate = self;
[_popover presentPopoverFromRect:CGRectMake(0, 0, 200, 200) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

EDIT2:它可能是相关的,我忘了提到,但是这个代码正在另一个视图中被调用。

这很好用!

UIViewController *viewController = [[UIViewController alloc] init];
viewController.contentSizeForViewInPopover = CGSizeMake(200, 200);
viewController.view.backgroundColor = [UIColor redColor];

UIPopoverController *popver1 = [[UIPopoverController alloc] initWithContentViewController:viewController];
[popver1 presentPopoverFromRect:CGRectMake(250, 200, 200, 200) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

DocumentViewController *document = [[DocumentViewController alloc] initWithIssue:_readerModel.currentIssue];
[self.navigationController pushViewController:document animated:YES];

当我在 DocumentViewController 中调用相同的 EXACT 代码时,它不起作用。

【问题讨论】:

您的 viewcontroller 已经有一个视图 - 为什么要影响其视图属性的视图?这听起来不对。 @tiguero 当然,但这不是现在的问题,我只是将其作为示例来显示代码。 【参考方案1】:

嗯。在这里看不到崩溃的原因(代码在我测试时工作正常)。

但是:如果您的代码中的self.view.superviewnil,它将崩溃并显示类似

的消息
 [...] Popovers cannot be presented from a view which does not have a window [...]

并且:如果您想正确显示popover,还需要进行一些修复:

viewController 中设置contentSizeForViewInPopover 属性 管理您的popover 的实际大小。

UIPopoverArrowDirectionDown 更改为 UIPopoverArrowDirectionAny (尤其是当您使用带有origin=(0,0) 的矩形来呈现时)。 否则你不会看到popover

【讨论】:

感谢您的解释,但不幸的是它对我没有任何帮助,我将self.view.superview 改回self.view,因为它是nil。添加了contetnSizeForViewInPopover 并将箭头方向更改为any,但是当我调用presentPopoverFromRect时它仍然会崩溃而没有任何警告 所以您的 Xcode 控制台中没有关于崩溃的消息?您是否在真实设备上进行测试?如果是这样:您检查过设备日志吗? 没有任何消息,只有Thread 1: signal SIGTRAP,我手头没有真正的设备。 谷歌搜索 SIGTRAP 告诉我这可能与 Xcode/Debugger 有关,与您的代码无关。我会尝试的第一件事:重启 Xcode。 我在 google SIGTRAP 之后尝试重新启动,但这似乎没有多大帮助,也许只是重新启动我的整个计算机。【参考方案2】:

您可以在显示弹出框之前检查窗口是否为零

if (self.view.window != nil)

您是否也在viewDidLoadviewWillAppear 中调用上述代码?

你能从viewDidAppear方法或didMoveToWindow方法中尝试相同的代码

【讨论】:

self.view.window 确实是nilviewDidAppear 好像没有被调用。 可能是您从添加为子视图的类中调用此代码,因此不会在子视图类中调用 viewDidAppear 方法。你能从superview类的viewDidAppear中调用包含popover相关代码的方法吗?另请查看this 类似问题。【参考方案3】:

我猜你应该将 popover 定义为属性,而不是局部变量

【讨论】:

以上是关于UIPopoverController presentPopoverFromRect 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

ini http://www.instalinux.com/download/preseed1132.txt

Cobbler+preseed自动化安装Ubuntu18/19系统

ubuntu14.04基于preseed批量分发环境搭建

运维部署自动化实践(二)PXE+Preseed自动安装Ubuntu16.04 server

UIPopoverController 上的 UIPopoverController

UIPopoverController 解雇