2011-05-10 73 views
1

我試圖實現一個UIPicker作爲UITextField的內容的自定義'編輯'輸入。Monotouch:UIPicker作爲第一響應者的UITextbox

到目前爲止,我有這樣的:

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子視圖中,選擇器撐在視圖中。

像這樣設置它似乎有很多痛苦。 我做錯了嗎?有沒有什麼辦法可以讓選擇器像默認的firstresponder(鍵盤)一樣行事?

回答

3

所以,如果我理解正確的話,你基本上要使用自定義鍵盤/輸入特定的文本框?

可以覆蓋UITextFieldInputView與自己的自定義UIView,它會顯示的那代替鍵盤當它成爲第一個響應者。

編輯

你的選擇器的InputView將是空,因此這就是爲什麼沒有奏效。您需要創建一個新的UIView並將其分配給tb_statusInputView。所以如果你把你的選擇器添加到這個視圖,那麼它應該顯示你的選擇器。

一個簡單的代碼示例:(我沒有得到驗證,這是100%正確的,但應該讓你對你的方式的時間)

...// snip 
UIView pickerView = new UIView(new RectangleF(0,0,320,216)); 
pickerView.AddSubview(pc_PDCAPicker); 
tb_status.InputView = pickerView; 
+0

認真嗎? (這會讓我真的很開心),我會再試一次。不掛斷。 – 2011-05-10 14:19:49

+0

我目前正在像這樣設置inputview:'tb_status.InputView = pc_PDCAPicker.InputView;'但沒有雪茄。 ('pc_PDCAPicker'是'UIPicker') – 2011-05-10 14:29:11

+0

你可以發佈代碼示例嗎? (漂亮嗎?) – 2011-05-10 14:33:51

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]; 

}

你不需要看鍵盤當你修改文本框,所以返回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]; 
} 

}

+0

它讓我有點接近,但還沒有應用: ( MonoTouch中沒有'textFieldDidEndEditing' *有* objectDidEndEditing',但它似乎有所不同,在這裏沒有任何幫助 – 2011-05-10 14:30:05

+0

你只需要在你的文本字段(或單聲道對象touch)開始編輯(檢查monodouch的objectDidBeginEditing中的對象比較(你可以在這裏說resignFirstResponder爲你的文本字段,這樣鍵盤不會彈出來,[textField resignFirstRespond ER])。並關閉objectdidEndEditing中的選擇器。 – 2011-05-10 15:08:11

+0

即使我可以得到這個工作,它會使我需要調整以適應子視圖的子視圖混亂,使上述答案的方法更清潔。 +1的努力。 – 2011-05-10 16:03:24

相關問題