1

我有一个弹出视图(计算器的),每当开始编辑文本字段时就会显示该视图。调用 display 方法的代码,以及 display 方法本身贴在下面。

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

显示视图的方法是:

-(IBAction)displayCalculator:(CGRect)rect{

    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];

    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

我的问题是:

1)我怎样才能让弹出框留下来?我希望用户能够单击文本字段(首先显示弹出窗口的文本字段),但是当他们这样做时,弹出窗口就会消失。

2)弹出窗口有时会以阻塞文本字段的方式出现,无论如何我可以控制弹出窗口的出现位置吗?我目前正在传递文本字段的框架,但这似乎不起作用

4

2 回答 2

2

检查文档以查看是否有解决所需任务或功能的方法或属性总是很好的(UIPopoverController

似乎对于您的第一个问题,您应该看一下该passthroughViews属性:

直通视图

弹出框可见时用户可以与之交互的一组视图。@property (nonatomic, copy) NSArray *passthroughViews Discussion

当弹出框处于活动状态时,与其他视图的交互通常会被禁用,直到弹出框被解除。将视图数组分配给此属性允许弹出框之外的点击由相应的视图处理。

对于第二个问题(覆盖文本区域),您可以偏移 textField.frame 以定义一个新CGRect的 popoverController 用作其锚点。

CGRect targetRect = CGRectOffset(textField.frame, n, n);
于 2012-07-27T21:14:55.173 回答
1

(问题 1)在您的 displayCalculator 方法中,您需要有一种方法来检查弹出窗口是否已经显示。截至目前,每次 textField 更新时,您都会重绘弹出窗口。您确实将 textFieldDelegate 调用更改为textFieldDidBeginEditing.

尝试这个:

-(BOOL)textFieldDidBeginEditing:(UITextField *)textField {

    //the background color may have been yellow if someone tried to submit the form with a blank field
    textField.backgroundColor = [UIColor whiteColor];

    sender = @"text field";

    [self displayCalculator:textField.frame];

    return YES;
}

-(IBAction)displayCalculator:(CGRect)rect{

//We don't want to continually create a new instance of popoverController. So only if it is nil we create one. 
if (popoverController == nil)
    calculator = [[CalculatorViewController alloc] initWithNibName:@"CalculatorViewController" bundle:nil];
    popoverController = [[[UIPopoverController alloc] initWithContentViewController:calculator] retain];

    [popoverController setPopoverContentSize:CGSizeMake(273.0f, 100.0f)];
}

//Check to make sure it isn't already showing. If it's not, then we show it. 
if (!popoverController.popoverVisible) {
    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

}

编辑

正如瘦子指出的那样(我应该提到)。每当您触摸弹出框外部时,弹出框就会消失。这就是为什么将 textFieldDelegate 更改为 textFieldDidBeginEditing 的原因。

这是一个很好的教程,可能会对您有所帮助。

如果一切都失败了,只需创建自己的弹出框。

于 2012-07-27T21:05:54.520 回答