簡體   English   中英

在iOS 6中, - [UITextField becomeFirstResponder]在-viewWillAppear中不起作用:

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM