Сбой на 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 ответов:
Как сообщил Аскер на свой вопрос,
MFMailComposeViewController
использует некоторые собственные элементы, которые не должны быть классифицированы. Таким образом, вы должны быть уверены, что нет никаких категорий для таких элементов, какUITextField
илиUITextView
.
Мне кажется, что у вас есть проблема с полем
Просто предлагаю вам проверить это предположение, заменив приведенное ниже утверждение.To:
класса iOSMFMailComposeViewController
. Возможно, вы посылаете"получателю" строковый массив, который не имеет допустимого объекта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];
MFMailComposeViewController является подклассом UINavigationController, поэтому убедитесь, что "self" здесь имеет UINavigationController.
Убедитесь, что вы импортировали messegeui framewok.
Проверьте, что вы подтвердили для протокола 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 }