Я пытаюсь написать родное расширение внутреннего номера родов для открытия iOS MailComposer. Теперь код «работает», но MFMailComposeViewController не отображая и Xcode показывает предупреждение:Ios MFMailComposeViewController не смещается
Attempt to present <MFMailComposeViewController: 0x12b60840> on <Iosmailto: 0xc1898d0> whose view is not in the window hierarchy!
Я читал, что UIViewControllers должна быть в иерархии, но я не могу представить это из Родоса кода рубинового или ясного-C расширения обертка. Теперь я пытаюсь представить свою UIViewController с MFMailComposeController из [UIApplication sharedApplication] .keyWindow.rootViewController но почта композитор еще не показывают.
интерфейс от iosmailto.h:
@interface Iosmailto : UIViewController<MFMailComposeViewControllerDelegate>
{
}
@property(nonatomic, assign) id delegate;
//-(IBAction)send_mail:(id)sender;
@end
реализация от iosmailto.m:
@implementation Iosmailto
- (void)viewDidLoad {
[super viewDidLoad];
[self send_mail];
}
- (void)send_mail {
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];
composer.mailComposeDelegate = self;
[composer setSubject:[NSString stringWithUTF8String:subj]];
NSArray *recipients_array = [NSArray arrayWithObject:[NSString stringWithUTF8String:recipients]];
[composer setToRecipients:recipients_array];
NSString *composerBody = [NSString stringWithUTF8String:message];
[composer setMessageBody:composerBody isHTML:NO];
[composer setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[self presentModalViewController:composer animated:YES];
[composer release];
} else {
NSLog(@"Device is unable to send email in its current state.");
}
}
/* some unnecessary for this question methods */
@end
А функция С определена в iosmailto.m Thats вызываются из Rhodes:
// find root vc
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
// find topmost vc
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
iosmailer = [[Iosmailto alloc] init];
iosmailer.delegate = topController;
[topController presentViewController:iosmailer animated:YES completion:nil];
Это приложение не для AppStore. При необходимости приветствуется.
Update инициализации для Iosmailto:
- (id)init
{
self = [super initWithNibName:nil bundle:nil];
return self;
}
Update 2 Краткая версия этого кода (без UIViewController обертке) была моей отправной точкой. Это тоже не работает. И это имеет такое же предупреждение и еще одно:
UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController;
while (topController.presentedViewController) {
topController = topController.presentedViewController;
}
if ([MFMailComposeViewController canSendMail]) {
MFMailComposeViewController *composer = [[MFMailComposeViewController alloc] init];
composer.mailComposeDelegate = (id<MFMailComposeViewControllerDelegate>)topController ;
[composer setSubject:[NSString stringWithUTF8String:subj]];
NSArray *recipients_array = [NSArray arrayWithObject:[NSString stringWithUTF8String:recipients]];
[composer setToRecipients:recipients_array];
NSString *composerBody = [NSString stringWithUTF8String:message];
[composer setMessageBody:composerBody isHTML:NO];
[composer setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[topController presentModalViewController:composer animated:YES];
[composer release];
} else {
}
Что ваш метод инициализации похож на Iosmailto? Вы хотите быть уверены, что вы либо вызываете initWithNib: (определенный в UIViewController, унаследованный вашим подклассом), либо убедитесь, что ваш собственный метод инициализации вызывает [super initWithNib:] – Idles
Сделано обновление с помощью init – rootatdarkstar
Сделано обновление кода без обертки – rootatdarkstar