2

UITextField が表示されているときはキーボードが正しく表示されますが、MFMailComposeViewController が表示されて閉じられた後に表示されないという問題があります。カーソルはテキストフィールドに表示されますが、キーボードは表示されません。

基本的に、ユーザーが「Create Preset」ボタンをタップすると、UITextField を含む現在のビューに UIView が追加されます。

[self.view addSubview:createPresetView];
[presetNameField becomeFirstResponder];

それはうまくいきます。ユーザーは複数の新しいプリセットを追加できます。ビューが追加されるたびに、テキスト フィールドがファーストレスポンダーになり、キーボードが表示されます。presetNameField がビュー階層にないという問題を除外するために、1 秒の遅延後に becomeFirstResponder を試してみましたが、結果は同じです。

次に、標準の MFMailComposeViewController を使用して、プリセットを電子メールで共有できます。

MFMailComposeViewController *mailView = [[MFMailComposeViewController alloc] init];
[mailView setMailComposeDelegate:appController];
[mailView setSubject:@"New preset"];
[mailView setMessageBody:@"\n\nMail from app" isHTML:NO];
[appController presentModalViewController:mailView animated:YES];

私が知る限り、メール作成ビューは正しく閉じます。

[controller.view endEditing:YES]; // I added this as a test to ensure the mail view resigns first responder, no difference.
[self dismissModalViewControllerAnimated:YES];
[controller release];
controller = nil;

ただし、[Create Preset] ボタンを押すと、ビューにテキスト フィールドが追加され、テキスト フィールドがファーストレスポンダとして設定されますが、キーボードが表示されません。

テキストフィールドで FirstResponder になったときに何が起こっているかを確認しました。テキストフィールド自体は有効で、canBecomeFirstResponder に YES を返します。

私が見つけた唯一の潜在的な手がかりは、[presetNameField becomeFirstResponder]が常にNO を返すことです (メール ビューが表示される前であっても)。

助言がありますか?

4

1 に答える 1

0

ご想像のとおり、MFMailComposeViewController はファーストレスポンダーを受け取ります。テキスト フィールドに firstResponder を返す組み込みのメカニズムはありません。しかし、あなたはそれを行うことができますviewWillAppear:

次のように、提示されたView Controller(MFMailComposeなど)から戻る場合にのみ、それを行うこともできます。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    // this is optional, if you care about context of presentation
    if (!self.isBeingPresented) {  // if we're not on our way up the stack of vcs
        [self.presetNameField becomeFirstResponder];
    }
}
于 2013-03-24T17:01:55.850 に答える