为啥在尝试将 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 时出现此构建错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 &mut self 允许借用 struct 成员,但不允许将 self 借用到不可变方法?
如何从 UIPopover 中的 UIButton 在主 UIView 中创建 UITextView?