0

Я пытаюсь написать родное расширение внутреннего номера родов для открытия 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 { 
} 
+0

Что ваш метод инициализации похож на Iosmailto? Вы хотите быть уверены, что вы либо вызываете initWithNib: (определенный в UIViewController, унаследованный вашим подклассом), либо убедитесь, что ваш собственный метод инициализации вызывает [super initWithNib:] – Idles

+0

Сделано обновление с помощью init – rootatdarkstar

+0

Сделано обновление кода без обертки – rootatdarkstar

ответ

5

Используйте этот код, чтобы представить вид контроллера

[[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:composer 
                            animated:YES 
                            completion:nil]; 
1

Хорошо, я думаю, проблема в том, что ваш UIViewController не имеет ничего в его свойстве зрения, потому что вы не используете файл .xib для его инициализации. See this question, который программно создает UIView и присваивает его свойству представления UIViewController. Я думаю, что это правильный путь. См. Реализацию метода -(void)loadView.

Ваш случай использования также немного странный, так как похоже, что у вашего Iosmailto UIViewController нет никакого контента, и вы просто используете его как оболочку вокруг MFMailComposeViewController - вы можете подумать о переопределении своего метода C напрямую создайте MFMailComposeViewController без ненужного слоя косвенности этого ненужного UIViewController, который ничего не отображает.