如何将 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的主要内容,如果未能解决你的问题,请参考以下文章

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

添加填充到以编程方式创建的UILabel

Mootools:如何将点击功能绑定到以编程方式生成的元素

如何将 segue 标识符添加到以编程方式进行的模态转换?

如何将 GraphQL 查询中的数据传递到以编程方式生成的页面上?

iOS 8.4 - iboutlet 未填充到以编程方式创建的视图控制器中