[英]In iOS 6, -[UITextField becomeFirstResponder] doesn't work in -viewWillAppear:
在iOS 5.1和iOS 5.0中它可以工作,但在iOS 6.0中鍵盤不顯示。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
現在我把邏輯移到-viewDidAppear:
.
// This works but is not desirable.
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.emailAddressTextField;
[textField becomeFirstResponder];
}
這有效,但不可取。 在加載視圖后顯示鍵盤上滑動畫。
我希望鍵盤存在,因為從左到右的動畫呈現了在導航控制器中加載的視圖。
有人知道如何在iOS 6中顯示視圖時加載鍵盤嗎?
更新
根據@ Duck的反饋,我做了一些測試。 這似乎特定於UITableViewCells中包含的UITextFields。
有沒有人有什么建議?
第一個解決方案
所以完整的描述。 這是一個帶有兩個靜態單元格(電子郵件和密碼)的表格視圖。 視圖中有一個分配了頁腳視圖的登錄按鈕。 這兩個單元格中包含一個文本字段,並且是自定義類型SICOTextFieldCell。
我的解決方案是在登錄按鈕后面放置一個假文本字段(在表格頁腳視圖中)。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UITextField *textField = self.SICO_fakeTextField;
[textField becomeFirstResponder];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UITextField *textField = self.SICO_emailAddressTextField;
[textField becomeFirstResponder];
}
新解決方案
基於@stm的答案,我提出了一個新的(優越的?)解決方案。
我的解決方案是調用-selectRowAtIndexPath:animated:scrollPosition:
. -[SICOTextFieldCell setSelected:animated:]
,這是一個自定義表格視圖單元格,調用[self.textField becomeFirstResponder]
,它可以正確地繪制鍵盤。 它仍然是一個黑客,但它是一個更干凈的黑客。
@interface SICOLogInViewController ()
@property (readonly, nonatomic) UITextField *SICO_emailAddressTextField;
@property (readonly, nonatomic) UITextField *SICO_passwordTextField;
@end
@implementation SICOLogInViewController
- (IBAction)logIn
{
// Controller Details
}
#pragma mark Private
- (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath
{
SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath];
return cell.textField;
}
#pragma mark View lifecycle
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:NO scrollPosition:UITableViewScrollPositionTop];
}
#pragma mark UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
switch (textField.returnKeyType) {
case UIReturnKeyGo: [self logIn]; break;
case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break;
default: break;
}
return YES;
}
#pragma mark Properties
- (UITextField *)SICO_emailAddressTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
}
- (UITextField *)SICO_passwordTextField
{
return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
}
@end
嘗試在創建單元格后在cellForRowAtIndexPath方法中調用它,或者在包含該textField的tableViewCell的viewWillAppear中調用它。
如果這給你相同的結果,你仍然希望鍵盤出現之前,我會使用“假”textField在開頭顯示鍵盤。 我的猜測是你的textField還沒有在viewWillAppear之前添加。
我完全嘗試了你的代碼,iOS6和viewWillAppear,它似乎工作正常。 當你翻到不同的視圖時,你試圖讓鍵盤顯示我是否正確?
我目前正在編寫自己的輸入表格套件,並且在這個問題上花費了幾個小時。 在發現我的編碼很好之后,我發現這個問題指向iOS 6中可能存在的故障,並為此制定了解決方案。
如果你有(或創建)自定義UITableViewCell,一個簡單的解決方案就是子類 - (void)layoutSubviews; 並檢查單元格的UITextField是否應該是第一個響應者(即通過檢查文本字段是否與您的委托中設置的焦點字段相同)。 如果是這樣,只需調用 - (BOOL)成為FirstResponder; 在您的UITextField上(再次)。
這絕對是比創建“假”UITextField更好的解決方案;)
-viewWillAppear可能在iOS6中沒有被調用? 您是否嘗試過將代碼放入- (void)viewWillLayoutSubviews
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.