6

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

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

私はMFMailComposeViewControllerのドキュメントは言う気づく:

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

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

答えて

1

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

[[[[mailcomposer.view.subviews objectAtIndex:3] subviews] objectAtIndex:2] becomeFirstResponder] 
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]; 
+0

優れています - これを行うための何かを見つけようとしていました。 ** RecipientTextField **を** MFRecipientTextField **に変更して動作させるだけでした。これはApp Storeの投稿には使用できますか、または文書化されていないAPIとみなされますか? – ayreguitar

+1

これはApp Storeの投稿に使用するのが問題ないのかどうかは分かりませんが、これは社内アプリケーションでのみ使用しています。 – holz

+0

アップルはこれを最近使用した私のアプリを承認しましたので、使用するのがいいと思われます(少なくとも今のところ!)もう一度ありがとうございます。 – ayreguitar

0

私はコードを簡素化してわかりやすくしたいと思います。 次のコードを入力してください:
[self presentModalViewController:mailComposer animated: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. 
    } 
} 
+0

ビュー階層をナビゲートするために再帰が必要であるため、これは機能しません。 – Gujamin

4

iOS 6では、最初のレスポンダをAFAICTのテキストフィールドに設定することはできません。ビュー階層をナビゲートすると、最終的にUIRemoteViewが表示され、ここのサブビューは難読化されます。

関連する問題