Сбой на MFMailComposeViewController


if ([MFMailComposeViewController canSendMail]) {

    MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init];
    mailViewController.mailComposeDelegate = self;
    [mailViewController setSubject:@"Support Enquiry"];
    [mailViewController setToRecipients:[NSArray arrayWithObject:EMAIL_SUPPORT]];

    [self presentModalViewController:mailViewController animated:YES];
    [mailViewController release];
}

Мой код падает на

MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; 

Строка с:

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', 
reason: 'CALayer position contains NaN: [nan 24.5]'
*** Call stack at first throw:
(
0   CoreFoundation                      0x011f75a9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x0134b313 objc_exception_throw + 44
2   CoreFoundation                      0x011afef8 +[NSException raise:format:arguments:] + 136
3   CoreFoundation                      0x011afe6a +[NSException raise:format:] + 58
4   QuartzCore                          0x00145ba2 _ZL18CALayerSetPositionP7CALayerRKN2CA4Vec2IdEEb + 177
5   QuartzCore                          0x00145d55 -[CALayer setPosition:] + 42
6   QuartzCore                          0x0013e24d -[CALayer setFrame:] + 763
7   UIKit                               0x0047eda2 -[UIView(Geometry) setFrame:] + 255
8   UIKit                               0x004ea660 -[UITextField setFrame:] + 166
9   MessageUI                           0x001faa48 -[_MFComposeRecipientView reflow] + 3371
10  MessageUI                           0x001f9678 -[_MFComposeRecipientView setLabel:] + 79
11  MessageUI                           0x001ff144 -[MFMailComposeView _setupField:withLabel:navTitle:property:changingView:toSize:fieldFrame:visible:] + 234
12  MessageUI                           0x00203277 -[MFMailComposeView _layoutSubviews:changingView:toSize:searchResultsWereDismissed:] + 1768
13  MessageUI                           0x001fea6f -[MFMailComposeView _layoutSubviews:changingView:toSize:] + 71
14  MessageUI                           0x001fea22 -[MFMailComposeView _layoutSubviews:] + 69
15  MessageUI                           0x00200859 -[MFMailComposeView initWithFrame:navigationItem:options:delegate:] + 2175
16  MessageUI                           0x00215ea6 -[MFMailComposeController initializeUI] + 228
17  MessageUI                           0x0021cfb9 -[MFMailComposeController initForContentSize:navigationItem:options:] + 147
18  MessageUI                           0x00236267 -[MFMailComposeRootViewController initWithCompositionContext:contentSize:mailComposeControllerOptions:] + 377
19  MessageUI                           0x0022fbe7 -[MFMailComposeViewController initWithComposition:contentSize:mailComposeControllerOptions:] + 726
20  MessageUI                           0x0022f634 -[MFMailComposeViewController initWithComposition:] + 68
21  MessageUI                           0x0022f71e -[MFMailComposeViewController initWithNibName:bundle:] + 98

...

Есть идеи, что происходит?

EDIT: все ответы до сих пор ничего не сделали, он все равно вылетает : (

EDIT 2: я наконец - то понял проблему-я добавил категорию в текстовое поле, и MFMailComposeViewController это совсем не понравилось.

9 3

9 ответов:

Как сообщил Аскер на свой вопрос, MFMailComposeViewController использует некоторые собственные элементы, которые не должны быть классифицированы. Таким образом, вы должны быть уверены, что нет никаких категорий для таких элементов, как UITextField или UITextView.

Мне кажется, что у вас есть проблема с полем To: класса iOS MFMailComposeViewController. Возможно, вы посылаете"получателю" строковый массив, который не имеет допустимого объекта NSString, и внутреннеiOS пытаетесь вычислить высоту вашей строки, используя sizeWithFont для To: поля .

Просто предлагаю вам проверить это предположение, заменив приведенное ниже утверждение.
[mailViewController setToRecipients:[NSArray arrayWithObject:EMAIL_SUPPORT]];

С

[mailViewController setToRecipients:[NSArray arrayWithObject:@"myCompanySupport@abc.com"]];

Дайте мне знать, если это снова сбой с тем же сообщением .

Отредактировано:

UITableView crash дает 'CALayerInvalidGeometry', причина: 'позиция CALayer содержит NaN: [160 nan]'

Просто попробуйте использовать

[mailviewcontroller setToRecipients:[NSArray arrayWithObjects:EMAIL_SUPPORT, nil]];

Либо обратитесь к этой ссылке:

Http://www.edumobile.org/iphone/iphone-programming-tutorials/mailsend-in-the-iphone/

Вот что я получил с отладкой, установленной на max:

Bool _WebTryThreadLock(bool), 0x4be8910: пытался получить веб-блокировку из потока, отличного от основного потока или веб-потока. Это может быть результатом вызова UIKit из вторичного потока. Сейчас грохочет...

Немного другой stacktrace, хотя:

#2  0x32b69f40 in -[MFComposeBodyField initWithFrame:]
#3  0x32b69afe in -[MFMailComposeView _setupBodyFieldWithHeaderFrame:enclosingFrame:changingView:frameToPin:wasSearching:]
#4  0x32b66c12 in -[MFMailComposeView _layoutSubviews:changingView:toSize:searchResultsWereDismissed:]
#5  0x32b6651e in -[MFMailComposeView _layoutSubviews:changingView:toSize:]
#6  0x001cafe2 in -[MFMailComposeViewAccessibility(SafeCategory) _layoutSubviews:changingView:toSize:]
#7  0x32b664ee in -[MFMailComposeView _layoutSubviews:]
#8  0x32b66202 in -[MFMailComposeView initWithFrame:navigationItem:options:delegate:]
#9  0x32b65876 in -[MFMailComposeController initializeUI]
#10 0x32b656c0 in -[MFMailComposeController initForContentSize:navigationItem:options:]
#11 0x32b6558c in -[MFMailComposeRootViewController initWithCompositionContext:contentSize:mailComposeControllerOptions:]
#12 0x32b64dc2 in -[MFMailComposeViewController initWithComposition:contentSize:mailComposeControllerOptions:]
#13 0x32b64bfe in -[MFMailComposeViewController initWithComposition:]
#14 0x32b8cfb2 in -[MFMailComposeViewController initWithNibName:bundle:]
#15 0x33169a12 in -[UIViewController init]

Вы не должны обращаться к UI из любого потока, кроме основного потока. Когда-либо.

Так что это действительно помогло в моем случае:

dispatch_async(dispatch_get_main_queue(), ^{
    /* Do somthing here with UIKit here */  

MFMailComposeViewController *picker = [[[MFMailComposeViewController alloc] initWithRootViewController:view] autorelease];
picker.mailComposeDelegate = self;  
NSArray *toRecipients = [NSArray arrayWithObject: subject ];    
[picker setToRecipients:to];    
[view presentModalViewController:picker animated:YES];
});

Если ничего не помогает, вы всегда можете открыть url-адрес mailto:

body= [(NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)body, NULL, CFSTR("?=&+"), kCFStringEncodingUTF8) autorelease];
String uri= [@"mailto:" adds:to];
uri=[[uri adds:@"?subject="] adds:subject];
uri=[[uri adds:@"&body="] adds:body];
  1. MFMailComposeViewController является подклассом UINavigationController, поэтому убедитесь, что "self" здесь имеет UINavigationController.

  2. Убедитесь, что вы импортировали messegeui framewok.

  3. Проверьте, что вы подтвердили для протокола UINavigationController в .H файл класса.

Пожалуйста, дайте мне знать, если это решает проблему.

Спасибо!

Ишанк

Если вы добавили категорию ниже в текстовое поле, то MFMailComposeViewController это совсем не понравилось. Так что избегайте этого. Я не знаю почему. Я пишу то, что наблюдал.

 - (CGRect)textRectForBounds:(CGRect)bounds {

          return CGRectInset( bounds , 10 , 0 );
    }

Но вы можете добавить эти категории, чтобы настроить текстовое поле:

      - (CGRect)borderRectForBounds:(CGRect)bounds;
      - (CGRect)placeholderRectForBounds:(CGRect)bounds;
      - (CGRect)editingRectForBounds:(CGRect)bounds;
      - (CGRect)clearButtonRectForBounds:(CGRect)bounds;
      - (CGRect)leftViewRectForBounds:(CGRect)bounds;
      - (CGRect)rightViewRectForBounds:(CGRect)bounds;

Я думаю, что это поможет вам.

У меня была та же проблема при представлении контроллера вида на iOS5/6 с ARC. Мое решение состояло в том, чтобы сохранить объект, который представлял MFMailComposeViewController с ivar.

@interface MyClass (){
     MailUtils *_mailUtils;
}
@end


{...
_mailUtils = [[MailUtils alloc] init];
[_mailUtils publish]; //in this method I create the MFMailComposeViewController
}