【问题标题】:UIPopoverController presentPopoverFromRect crashesUIPopoverController presentPopoverFromRect 崩溃
【发布时间】: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 当然,但这不是现在的问题,我只是将其作为示例来显示代码。

标签: iphone ios uipopover


【解决方案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 定义为属性,而不是局部变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多