如何将 UIPopover 附加到以编程方式创建的 CGRect
Posted
技术标签:
【中文标题】如何将 UIPopover 附加到以编程方式创建的 CGRect【英文标题】:How to attach a UIPopover to a CGRect created programmatically 【发布时间】:2013-05-14 02:15:04 【问题描述】:我有一个 UIPopover,我以编程方式创建了几个 UITextField。如果点击其中一个 UITextfields,我希望 UIPopoverController 内的 UIDatePicker 指向导致点击的 UITextfield。我能够得到标签,所以我知道哪个 CGRect 导致了点击;问题是我无法让 UIPopoverController 的箭头指向那个特定的矩形。
这是代码(inView: self.frame 不正确;这只是我尝试过的事情之一)
if(textField.tag == 1301 ) // 'startTime' text field
UIViewController* popoverContent = [[UIViewController alloc] init]; //ViewController
UIView *popoverView = [[UIView alloc] init]; //view
popoverView.backgroundColor = [UIColor blackColor];
UIDatePicker *datePicker=[[UIDatePicker alloc]init];//Date picker
datePicker.frame=CGRectMake(0,44,180,186); // 180,186
datePicker.datePickerMode = UIDatePickerModeTime;
[datePicker setMinuteInterval:15];
[datePicker setTag:1310];
[datePicker addTarget:self action:@selector(Result) forControlEvents:UIControlEventValueChanged];
[popoverView addSubview:datePicker];
popoverContent.view = popoverView;
innerPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
[innerPopoverController setPopoverContentSize:CGSizeMake(180,206) animated:NO];
[innerPopoverController presentPopoverFromRect:CGRectMake(305, -190, 80, 35) // WRONG! TODO
inView:self.frame
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
CGRectMake 具有与创建 UITextfield 相同的参数 (x,y,w,h)。我得到的错误是:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIPopoverController presentPopoverFromRect:inView:permittedArrowDirections:animated:]:无法从没有窗口的视图中呈现弹出框。”
这是否可能,在 UIPopover 中有一个 UIPopover?
【问题讨论】:
将self.view
传递给inView:
参数(假设self
是视图控制器. It is also required that
self.view` 在您呈现弹出框时已经显示。阅读错误。这意味着视图尚未添加(呈现)。
构建错误:在“SubViewData *”类型的对象上找不到属性“view”(SubViewData 是第一个 UIPopover 所在的视图控制器)
您需要将UIView
传递给inView
参数。它必须是您要从中显示弹出框的视图。并且rect
参数应该与该视图相关。
那个特定的 UIView 将是现在显示第一个 UIPopover 的那个...我在方法 -textFieldShouldBeginEditing 中,我所拥有的只是矩形的标签用户点击了。
【参考方案1】:
应该是这样的:
innerPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
[innerPopoverController setPopoverContentSize:CGSizeMake(180,206) animated:NO];
[innerPopoverController presentPopoverFromRect:CGRectMake(305, -190, 80, 35) // WRONG! TODO
inView: SubViewData.view
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
如果你有一个视图的标签,那么这样做:
UIView *tappedView=[SubViewData.view viewWithTag:yourTag];
innerPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverContent];
[innerPopoverController setPopoverContentSize:CGSizeMake(180,206) animated:NO];
[innerPopoverController presentPopoverFromRect:CGRectMake(305, -190, 80, 35) // WRONG! TODO
inView: tappedView.superView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
【讨论】:
关闭,但不是...出现构建错误:在“SubViewData”类型的对象上找不到属性“视图” “标签”属于第一个 UIPopover 中的 UITextField,而不是包含弹出框的视图... 我试图将 datePicker 附加到 popoverView,但收到此错误消息,这让我相信我不能在弹出框内有弹出框...有人可以验证吗? *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIPopoverController presentPopoverFromRect:inView:permittedArrowDirections:animated:]:无法从没有窗口的视图中呈现弹出框。” 不,抱歉......它现在在弹出框之外,随机指向弹出框的父级。感谢你的付出;我将尝试另一种方法。以上是关于如何将 UIPopover 附加到以编程方式创建的 CGRect的主要内容,如果未能解决你的问题,请参考以下文章