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.superview
是nil
,它将崩溃并显示类似
[...] 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)
您是否也在viewDidLoad
或viewWillAppear
中调用上述代码?
你能从viewDidAppear
方法或didMoveToWindow
方法中尝试相同的代码
【讨论】:
self.view.window
确实是nil
,viewDidAppear
好像没有被调用。
可能是您从添加为子视图的类中调用此代码,因此不会在子视图类中调用 viewDidAppear 方法。你能从superview类的viewDidAppear中调用包含popover相关代码的方法吗?另请查看this 类似问题。【参考方案3】:
我猜你应该将 popover 定义为属性,而不是局部变量
【讨论】:
以上是关于UIPopoverController presentPopoverFromRect 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
ini http://www.instalinux.com/download/preseed1132.txt
Cobbler+preseed自动化安装Ubuntu18/19系统
运维部署自动化实践(二)PXE+Preseed自动安装Ubuntu16.04 server