Сбой в MFMailComposeViewController - PullRequest
3 голосов
/ 12 июня 2011
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

...

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

РЕДАКТИРОВАТЬ: Все ответы до сих пор ничего не сделали, он по-прежнему вылетает: (

РЕДАКТИРОВАТЬ 2: Я наконец понял проблему - я добавил категорию в текстовое поле, и MFMailComposeViewController это совсем не понравилось.

Ответы [ 9 ]

1 голос
/ 16 июня 2012

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

1 голос
/ 12 июня 2011

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

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

[mailViewController setToRecipients:[NSArray arrayWithObject:EMAIL_SUPPORT]];

С

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

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

РЕДАКТИРОВАНИЕ:

Сбой UITableView выдает «CALayerInvalidGeometry», причина: «Положение CALayer содержит NaN: [160 нан.]»

0 голосов
/ 30 октября 2012

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

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


{...
_mailUtils = [[MailUtils alloc] init];
[_mailUtils publish]; //in this method I create the MFMailComposeViewController
}
0 голосов
/ 15 февраля 2012

Если вы добавили указанную ниже категорию в текстовое поле, 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;

Думаю, это тебе поможет.

0 голосов
/ 13 июня 2011
  1. MFMailComposeViewController является подклассом UINavigationController, поэтому убедитесь, что у «self» здесь есть UINavigationController.

  2. Убедитесь, что вы импортировали фреймворк MessegeUI.

  3. Убедитесь, что вы подтвердили протокол UINavigationController в файле .h класса.

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

Спасибо!

Ishank

0 голосов
/ 13 июня 2011

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

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];
0 голосов
/ 13 июня 2011

Вы не должны получать доступ к пользовательскому интерфейсу из какого-либо потока, кроме основного потока. Когда-либо.

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

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];
});
0 голосов
/ 13 июня 2011

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

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

немного другая трассировка стека, хотя:

#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]
0 голосов
/ 12 июня 2011

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

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

либо ссылаются на эту ссылку:

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

...