为啥在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误?

Posted

技术标签:

【中文标题】为啥在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误?【英文标题】:Why this build error when trying to attach a UIPopover to a UIButton in a different class?为什么在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误? 【发布时间】:2014-08-31 19:11:21 【问题描述】:

我正在尝试将条形码扫描 API 合并到我的 ipad 应用程序(XCode5、ios7、Storyboards)中。尽管代码已执行,但我似乎无法让它工作。为简洁起见,完整的扫描码可以在here找到。问题似乎出在扫描类的这段代码中:

 //  define the window
_highlightView = [[UIView alloc] init];
_highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
_highlightView.layer.borderColor = [UIColor greenColor].CGColor;
_highlightView.layer.borderWidth = 3;
[self.view addSubview:_highlightView];

认为我需要的是一个带有小 UIView 的 UIPopover,因为我当前的 UIView 上没有任何内容。所以这是我想出的代码:

UIViewController* popoverContent = [[UIViewController alloc] init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 350, 500)];
popoverView.backgroundColor = [UIColor colorWithWhite:(CGFloat)1.0 alpha:(CGFloat)1.0];  //  frame color?
popoverContent.view = popoverView;

//resize the popover view shown in the current view to the view's size
popoverContent.preferredContentSize = CGSizeMake(350, 500);

_highlightView = [[UIView alloc] init];
_highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
_highlightView.layer.borderColor = [UIColor greenColor].CGColor;
_highlightView.layer.borderWidth = 3;
[self.view addSubview:_highlightView];

//  if previous popoverController is still visible... dismiss it
if ([popoverController isPopoverVisible]) 
    [popoverController dismissPopoverAnimated:YES];


//create a popover controller
DetailViewController *dvc = [[DetailViewController alloc]init];

popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];

[popoverController presentPopoverFromRect:dvc.oReadBarCode.frame 
                               inView:self.view
             permittedArrowDirections:UIPopoverArrowDirectionUp 
                             animated:YES];

但是,我在最后一行出现了构建错误,其中我展示了定义将弹出框附加到的按钮的PopoverFromRect:

无法从没有窗口的视图中呈现弹出窗口。'

我该如何解决这个问题? (想法是让 UIPopover 显示扫描结果)。

【问题讨论】:

【参考方案1】:

您不需要将框架转换为按钮...另外,您的括号似乎已关闭。

你可以这样做:

[popoverController presentPopoverFromRect:dvc.oReadBarCode.frame 
                                   inView:self.view
                 permittedArrowDirections:UIPopoverArrowDirectionUp 
                                 animated:YES];

编译器投诉本身(供将来参考)似乎是因为您试图将结构转换为指针,但这是无法完成的。

【讨论】:

在获得此代码之前您会做什么?为防止出现错误,请将所有内容包装在 if (self.view.window) /* code */ 所以所有这些代码都在viewDidLoad中?将其移至viewWillAppear:viewDidAppear: 视图没有窗口,除非它作为子视图添加到有窗口的视图中,或者,如果它是视图控制器的 .view 属性,那么它不会viewDidLoad 没有窗口(我认为),直到 viewWillAppear:viewDidAppear: 才有窗口。 两个都没有被执行...只有 -viewDidLoad 会。 什么都没有被执行?如果viewWillAppear:viewDidAppear: 没有被执行,那么你的视图肯定不会有一个窗口......因为它没有出现......而且你不能在一个没有出现的视图上显示一个弹出窗口......是运行时错误告诉你的。

以上是关于为啥在尝试将 UIPopover 附加到不同类中的 UIButton 时出现此构建错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIPopover 附加到我绘制的矩形

UIPopover 中的 UIDatePicker

为啥 &mut self 允许借用 struct 成员,但不允许将 self 借用到不可变方法?

如何从 UIPopover 中的 UIButton 在主 UIView 中创建 UITextView?

opencv-python:为啥检测到不正确的边界框(几个边界框)?

将新的不可变映射值附加到不可变列表