2009-11-06 32 views
6

Tôi đang sử dụng ứng dụng ví dụ MailComposer của Apple để gửi email từ bên trong ứng dụng của tôi (chức năng OS 3.0). Có thể đặt trường Tới, Chủ đề hoặc Nội dung là người trả lời đầu tiên bằng MFMailComposeViewController không?Đặt Responder đầu tiên trong MFMailComposeViewController?

Nói cách khác, hành vi sẽ là: người dùng nhấn một nút hiển thị chế độ xem thư (presentModalViewController). Khi xem thư được hiển thị, con trỏ được đặt ở một trong các trường và bàn phím sẽ mở ra.

tôi nhận thấy tài liệu MFMailComposeViewController nói:

"Quan trọng:. Giao diện phần tử tự nó không tùy biến và không được thay đổi bởi ứng dụng của bạn Ngoài ra, sau khi trình bày giao diện, ứng dụng của bạn không được phép thực hiện thêm thay đổi đối với nội dung email. Người dùng vẫn có thể chỉnh sửa nội dung bằng giao diện, nhưng thay đổi có lập trình bị bỏ qua. Do đó, bạn phải đặt giá trị của trường nội dung trước khi trình bày giao diện. "

Tuy nhiên, tôi không quan tâm đến việc tùy chỉnh giao diện. Tôi chỉ muốn thiết lập điều đó. Bất kỳ ý tưởng?

Trả lời

1

Bạn có thể thử gọi điện trở thànhFirstResponder trên chính bộ điều khiển. Nếu điều đó không hiệu quả, bạn có thể thử trong trình gỡ rối nhận danh sách các bản xem trước của chế độ xem thư cho đến khi bạn tìm thấy một trường text hoặc textview quen thuộc mà sau đó bạn có thể mã đặc biệt để đặt trạng thái trả lời trong mã. điều này (tôi không biết nếu điều này có hiệu quả không nhưng đây là một ví dụ):

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

Bạn có thể làm cho các trường này trở thành trả lời đầu tiên.

nếu bạn thêm các phương pháp sau đây để lớp học của bạn ...

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

Sau đó, sau khi bạn trình bày các MFMailComposeViewController, vượt qua quan điểm của MFMailComposeViewController vào chức năng cùng với các lĩnh vực bạn muốn trở thành responder đầu tiên.

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

Giờ tuyệt vời - dành nhiều thời gian để tìm cách làm việc này. Chỉ cần thay đổi ** RecipientTextField ** thành ** MFRecipientTextField ** để hoạt động. Đây có phải là OK để sử dụng cho các lần gửi trên App Store hay được coi là API không có giấy tờ không? – ayreguitar

+1

Tôi không chắc chắn nếu điều này là ok để sử dụng cho App Store đệ trình, tôi đã chỉ được sử dụng này cho các ứng dụng trong nhà. – holz

+0

Apple đã phê duyệt ứng dụng của tôi đã sử dụng ứng dụng này gần đây, vì vậy có vẻ như nó được sử dụng tốt (ít nhất là bây giờ!) Cảm ơn bạn lần nữa. – ayreguitar

0

Tôi thích đơn giản hóa mã và giúp bạn dễ hiểu. Chỉ cần đặt mã sau đây:
[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

Điều này không hoạt động khi đệ quy là cần thiết để điều hướng xuống phân cấp khung nhìn. – Gujamin

4

Trong iOS 6, bạn không còn có thể đặt trả lời đầu tiên trên bất kỳ trường văn bản AFAICT nào. Việc điều hướng phân cấp khung nhìn cuối cùng cho thấy một UIRemoteView và các bản xem trước bên trong ở đây bị làm mờ đi.

Các vấn đề liên quan