2009-11-06 17 views
6

Używam aplikacji przykładowej Apple MailComposer do wysyłania wiadomości e-mail z poziomu mojej aplikacji (funkcjonalność systemu operacyjnego 3.0). Czy jest możliwe ustawienie pól Do, Temat lub Treść jako pierwszej odpowiedzi za pomocą MFMailComposeViewController?Ustaw pierwszy obiekt odpowiadający w MFMailComposeViewController?

Innymi słowy, zachowanie to: użytkownik naciska przycisk wyświetlający widok poczty (presentModalViewController). Po wyświetleniu widoku poczty kursor zostanie umieszczony w jednym z pól, a klawiatura zostanie otwarta.

zauważam dokumentacja MFMailComposeViewController mówi:

„. Ważne: Interfejs kompozycja poczta sama nie jest konfigurowalny i nie może być modyfikowana przez aplikację Ponadto po przedstawieniu interfejsu, aplikacja nie wolno wprowadzać dalsze zmiany w treści wiadomości e-mail, ale użytkownik może edytować zawartość za pomocą interfejsu, ale zmiany programistyczne są ignorowane, dlatego przed wyświetleniem interfejsu należy ustawić wartości pól treści. "

Nie zależy mi jednak na dostosowywaniu interfejsu. Chcę tylko ustawić ten pierwszyResponder. Jakieś pomysły?

Odpowiedz

1

Możesz spróbować po prostu wywołać funkcję FirstResponder na kontrolerze. Jeśli to nie zadziała, możesz spróbować w debugerze uzyskać listę subskrybentów widoku komponowania wiadomości e-mail, dopóki nie znajdziesz znanego pola tekstowego lub widoku tekstowego, który możesz następnie kodować specjalnie w celu ustawienia statusu respondenta w kodzie, co może wyglądać podobnie to (nie wiem, czy to zadziała, ale jest to przykład):

[[[[mailcomposer.view.subviews objectAtIndex:3] subviews] objectAtIndex:2] becomeFirstResponder] 
8

Jesteś w stanie uczynić te pola pierwszym respondentem.

jeśli dodać następującą metodę do klasy ...

//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; 
} 

Następnie, po przedstawienie MFMailComposeViewController przechodzą pogląd MFMailComposeViewController jest do funkcji wraz z polem chcesz zostać najpierw reagował.

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

Świetnie - spędziłem godziny próbując znaleźć coś, co można zrobić. Wystarczy zmienić ** RecipientTextField ** na ** MFRecipientTextField ** do pracy. Czy można to wykorzystać do przesłania do sklepu App Store, czy też uznać za nieudokumentowane API? – ayreguitar

+1

Nie jestem pewien, czy można z nich korzystać w aplikacjach App Store, użyłem tego tylko w aplikacjach domowych. – holz

+0

Apple zatwierdził moją aplikację, która ostatnio to wykorzystała, więc wygląda na to, że jest w porządku (przynajmniej na razie!) Jeszcze raz dziękuję. – ayreguitar

0

Uwielbiam uprościć kod i ułatwić jego zrozumienie. Wystarczy umieścić następujący kod po:
[self presentModalViewController: mailComposer animowane: TAK];

+0

To nie działa, ponieważ rekursja jest konieczna do przejścia w dół hierarchii widoków. – Gujamin

4

W systemie iOS 6 nie jest już możliwe ustawienie pierwszej odpowiedzi na żadnym z pól tekstowych AFAICT. Poruszanie się po hierarchii widoków w końcu ujawnia UIRemoteView, a subspekcje tutaj są zaciemniane.

Powiązane problemy