Monotouch:UIPicker作为UITextbox的第一响应者

时间:2011-05-10 12:47:53

标签: c# iphone xamarin.ios

我正在尝试将UIPicker实现为UITextField内容的自定义“编辑”输入。

到目前为止我有这个:

public override void ViewDidLoad ()
{
 // ... snip

    tb_status.EditingDidBegin += delegate {
        //prevent keyboard from popping up
        tb_status.ResignFirstResponder();

        TogglePDCASelect();
    };

    tb_status.ShouldReturn = (textField) => {
        TogglePDCASelect();
        textField.ResignFirstResponder();
        return true;
    };
 // ... snip

    private void TogglePDCASelect()
    {
            pc_PDCAPicker.Hidden = !pc_PDCAPicker.Hidden;
            if(pc_PDCAPicker.Hidden)
        {
                        //AccomodateResponder accomodates the UIScrollView `vwDetails` so that there is room for the responder
                        //and recalculates the scroll content size.
                        //deaccomodate does the reverse.
                scrollViewer.DeAccomodateResponder(vwDetails);
        } 
        else 
        {
            scrollViewer.AccomodateResponder(vwDetails, tb_status.Frame);
        }
    }

到目前为止,非常好,但是当我点击调用选择器的文本框,然后点击普通文本字段或切换vwDetails子视图时,选择器仍保持在视图中。

像这样设置起来似乎很痛苦。 我做错了吗?有什么方法可以让选择器像默认的第一响应者(键盘)一样运行?

2 个答案:

答案 0 :(得分:3)

因此,如果我理解正确,您基本上想要为该特定文本字段使用自定义键盘/输入?

您可以使用自己的自定义UITextField覆盖InputView的{​​{1}},当它成为第一响应者时,它将显示而不是键盘。

编辑

您的选择器UIView将为空,这就是为什么这不起作用。您需要创建一个新的InputView并将其分配给UIView的{​​{1}}。因此,如果您将选择器添加到此视图,则应显示您的选择器。

一个简单的代码示例:(我没有时间来验证这是100%正确但是应该让你继续前进)

tb_status

答案 1 :(得分:1)

让我们说你的视图是320 x 480.所以最初你的选择器应该有框架为x,320,宽度,高度。

现在,当用户编辑文本字段时,使用UIView动画将选取器框架设置为某个可见高度,如下所示。

-(void) presentPickerView{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];

CGRect viewFrame = self.pickerView.frame;

viewFrame.origin.y -= self.pickerView.bounds.size.height;

self.pickerView.frame = viewFrame;

[UIView commitAnimations];

}

-(void) dismissPickerView {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3f];

CGRect viewFrame = self.pickerView.frame;

viewFrame.origin.y += self.pickerView.bounds.size.height;

self.pickerView.frame = viewFrame;

[UIView commitAnimations];

}

编辑此textField时无需查看键盘,因此请在此处返回NO。

-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField {
if ([textField isEqual:myTextField]) {
    [self presentPickerView];
    return NO;
}
return YES;

}

完成文本字段编辑后,将选择器设置为动画。

- (void)textFieldDidEndEditing:(UITextField *)textField {
if ([textField isEqual:myTextField]) {
    // Animate picker down back again.
    [self dismissPickerView];
}

}