6

Apple のMailComposerサンプル アプリケーションを使用して、アプリケーション内から電子メールを送信しています (OS 3.0 機能)。MFMailComposeViewController を使用して、To、Subject、または Body フィールドをファーストレスポンダとして設定することは可能ですか?

つまり、動作は次のようになります。ユーザーは、メール ビュー (presentModalViewController) を表示するボタンを押します。メール ビューが表示されると、カーソルがフィールドの 1 つに置かれ、キーボードが開きます。

MFMailComposeViewController のドキュメントに次のように記載されていることに気付きました。

「重要: メール作成インターフェース自体はカスタマイズ可能ではないため、アプリケーションで変更してはなりません。さらに、インターフェースを表示した後、アプリケーションはメールの内容をさらに変更することはできません。ユーザーは引き続き、次を使用して内容を編集できます。ただし、プログラムによる変更は無視されます。したがって、インターフェースを表示する前にコンテンツ フィールドの値を設定する必要があります。

ただし、インターフェイスのカスタマイズについては気にしません。そのfirstResponderを設定したいだけです。何か案は?

4

4 に答える 4

8

これらのフィールドをファーストレスポンダーにすることができます。

次のメソッドをクラスに追加すると...

//Returns true if the ToAddress field was found any of the sub views and made first responder
//passing in @"MFComposeSubjectView"     as the value for field makes the subject become first responder 
//passing in @"MFComposeTextContentView" as the value for field makes the body become first responder 
//passing in @"RecipientTextField"       as the value for field makes the to address field become first responder 
- (BOOL) setMFMailFieldAsFirstResponder:(UIView*)view mfMailField:(NSString*)field{
    for (UIView *subview in view.subviews) {

        NSString *className = [NSString stringWithFormat:@"%@", [subview class]];
        if ([className isEqualToString:field])
        {
            //Found the sub view we need to set as first responder
            [subview becomeFirstResponder];
            return YES;
        }

        if ([subview.subviews count] > 0) {
            if ([self setMFMailFieldAsFirstResponder:subview mfMailField:field]){
                //Field was found and made first responder in a subview
                return YES;
            }
        }
    }

    //field not found in this view.
    return NO;
}

次に、MFMailComposeViewControllerを提示した後、MFMailComposeViewControllerのビューを、ファーストレスポンダーにしたいフィールドとともに関数に渡します。

MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
mailComposer.mailComposeDelegate = self;

/*Set up the mail composer*/

[self presentModalViewController:mailComposer animated:YES];
[self setMFMailFieldAsFirstResponder:mailComposer.view mfMailField:@"RecipientTextField"];
[mailComposer release];
于 2010-07-13T01:42:08.263 に答える
4

iOS 6 では、テキスト フィールド AFAICT のいずれかにファーストレスポンダを設定することはできなくなりました。ビュー階層をナビゲートすると、最終的に UIRemoteView が明らかになり、ここにあるサブビューは難読化されます。

于 2013-03-09T14:23:49.873 に答える
1

コントローラー自体で becomeFirstResponder を呼び出すだけで試すことができます。それがうまくいかない場合は、おなじみのテキストフィールドまたはテキストビューが見つかるまで、デバッガーでメール作成ビューのサブビューのリストを取得してみてください。次に、コードでレスポンダーステータスを設定するために具体的にコーディングできます。これ(これが機能するかどうかはわかりませんが、例です):

[[[[mailcomposer.view.subviews objectAtIndex:3] subviews] objectAtIndex:2] becomeFirstResponder]
于 2010-02-12T17:03:12.237 に答える
0

コードを単純化し、理解しやすくするのが好きです。
[self presentModalViewController:mailComposer animation:YES];の後に次のコードを追加するだけです。

for (UIView *subview in mailComposer.view.subviews) {
   NSString *className = [NSString stringWithFormat:@"%@", [subview class]];
   //NSLog(@"%@", className); // list the views - Use this to find another view
   //The view I want to set as first responder: "_MFMailRecipientTextField"
   if ([className isEqualToString:@"_MFMailRecipientTextField"]){
   [subview becomeFirstResponder];
   break; // Stop search.
  }
}
于 2012-04-04T01:05:30.417 に答える