6

저는 애플의 MailComposer 예제 응용 프로그램을 사용하여 내 응용 프로그램 (OS 3.0 기능) 내에서 전자 메일을 보냅니다. 받는 사람, 제목 또는 본문 필드를 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 **로 변경하면됩니다. 이 앱 스토어 제출에 사용할 수 있습니까, 아니면 문서화되지 않은 API로 간주됩니까? – ayreguitar

+1

앱 스토어 제출에 사용해도 괜찮은지 확신 할 수 없지만 집 애플리케이션 용으로 만 사용했습니다. – 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가 표시되고 여기의 하위 뷰는 모호 해집니다.

관련 문제