0

私はMFMessageComposeViewControllerDelegateプロトコルに準拠したVCを持っています。私は正常に次のコードで、このビューコントローラを提示していますMFMessageComposeVIewControllerが自身の代わりにデリゲートを破棄しています

- (IBAction)textAction:(id)sender { 
    if(![MFMessageComposeViewController canSendText]) 
    { 
     UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Your device doesn't support SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [warningAlert show]; 
     return; 
    } 

    NSString *numberToCallOrText = self.phoneNumber; 
    NSString *message = @"Test message"; 
    NSArray *recipients = [NSArray arrayWithObject:numberToCallOrText]; 
    MFMessageComposeViewController *messageController = [[MFMessageComposeViewController alloc] init]; 
    messageController.messageComposeDelegate = self; 
    [messageController setRecipients:recipients]; 
    [messageController setBody:message]; 

    // Present message view controller on screen 
    [self.view endEditing:YES]; 
    [self presentViewController:messageController animated:YES completion:nil]; 
} 

はまた、私はそうのような仕上がりの結果を処理しています:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult) result 
{ 
    switch (result) { 
     case MessageComposeResultCancelled: 
      NSLog(@"Canceled"); 
      break; 

     case MessageComposeResultFailed: 
     { 
      NSLog(@"Failed"); 
      UIAlertView *warningAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to send SMS!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [warningAlert show]; 
      break; 
     } 

     case MessageComposeResultSent: 
      NSLog(@"sent"); 
      [self.navigationController popViewControllerAnimated:YES]; 
      break; 

     default: 
      break; 
    } 
    [controller.view endEditing:YES]; 
    [self.navigationController popViewControllerAnimated:YES]; 
// [self dismissViewControllerAnimated:YES completion:nil]; 
// [controller popToViewController:self animated:YES]; 
// [controller dismissViewControllerAnimated:YES completion:nil]; 
} 

3つのコメントアウト行は私の選択肢です試しました。 MFMessageComposeViewControllerが画面に残っている(キーボードが消滅しても)が、デリゲートがスタックからポップされていることが起こります。したがって、再度キャンセルを押すと、null参照エラーが発生します。

この同じ実装は私のコードのどこかで動作するので、奇妙です。唯一の違いは、ボディを初期化するように設定していることです。

間違ったVCがここにポップされている理由は何ですか?

ありがとうございました。

編集 - 壊れた実装は、UIView ControllerではなくUITableViewControllerにあります。問題の原因は何ですか?

+0

TableVCについての編集とは別に、すべてが(一点で)*まったく同じ方法で実装されていました。 'setBody'呼び出しもコメントアウトしました。それはまだアプリの他の場所で動作します。キャンセルボタンが機能しないのはここだけです。 –

答えて

0

....願う問題ではなくのUIViewControllerののUITableViewControllerからMFMessageComposeViewControllerを呼び出すことに由来するように見えます。したがって、代わりに私のソリューションは、MFMessageComposeViewControllerをプッシュし、MFMessageComposeViewControllerの完了ハンドラでそれ自体をディスミングする別のビューコントローラをテーブルにプッシュさせることでした。

0

presentViewController:animated:completion:を使用してメッセージコンポーザントを提示しています。このように表示コントローラを表示する場合は、dismissViewControllerAnimated:completion:を使用して表示コントローラを終了する必要があります。

しかし、あなたはpopViewControllerAnimated:を使用しています。これは、ナビゲーションコントローラに、ナビゲーションスタックの最上部にあるどのビューコントローラも却下するように指示しています。これはメッセージコンポーザーではなく、それを提示したビューコントローラーです。

あなたはコメントアウトされた行の1つに近づいていました。あなたはまた、行を削除する必要が

[controller dismissViewControllerAnimated:YES completion:nil]; 

[self.navigationController popViewControllerAnimated:YES]; 

て:あなたは交換する必要が

[self.navigationController popViewControllerAnimated:YES]; 

メッセージが送信されたとき。余分な釈放をしないでください。

+0

これは私のコメントされた行の一つです。私が実際に、 '[self dismissViewControllerAnimated:YES completion:nil];の後にもう一度試みました。これは、私が持っている他の実装で取り組んでいるものです。これは 'presentViewController'と組み合わせて、Appleがここに書いているものです:https://developer.apple.com/reference/messageui/mfmessagecomposeviewcontroller?language=objc –

+0

また、ここでも動作します。また、メッセージコンポーザーのdelegateメソッドで 'endEditing:'への呼び出しを取り除く必要があります。 – rmaddy

+0

ここでは機能しませんでした。私は後で 'self dismissViewController:..'と '[controller dismissViewController:...'を試して、 'endEditing:'を追加しました。なぜなら、これが呼び出されたtableVCが解放されていることを確認するためにブレークポイントを設定していなかったから、私はキーボードが却下されたと思っていたが、何とか解散を食べていた。 –

0

コードは、以下を参照してくださいあなたのための有用な

-(void) showEmailModalView  
{ 
    if ([MFMailComposeViewController canSendMail]) 
    { 
     MFMailComposeViewController* controller 
     = [[MFMailComposeViewController alloc] init]; 
     controller.mailComposeDelegate = self; 
     [controller setToRecipients: @[@"[email protected]"]]; 

     [self presentViewController: controller 
          animated: YES 
         completion: nil]; 
    } 
    else 
    { 
     UIAlertController* alert = [UIAlertController 
      alertControllerWithTitle: @"Email not configured" 
      message: @"Please add/enable an email " 
      @"account in the phone to send email" 
      preferredStyle: UIAlertControllerStyleAlert]; 

     UIAlertAction* ok = [UIAlertAction 
      actionWithTitle: @"Ok" 
      style: UIAlertActionStyleDefault 
      handler: nil]; 

     [alert addAction: ok]; 

     [self presentViewController: alert 
          animated: YES 
         completion: nil]; 
    } 
} 


- (void) mailComposeController : (MFMailComposeViewController*) controller didFinishWithResult : (MFMailComposeResult) result error :(NSError*) error 

{ 

    switch (result)   
    { 

     case MFMailComposeResultCancelled: 
     break; 
     case MFMailComposeResultSaved: 
     break; 
     case MFMailComposeResultSent: 
     break; 
     case MFMailComposeResultFailed: 
     break; 

     default: 
     { 

     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Email" message:@"Sending Failed - Unknown Error :-(" preferredStyle:UIAlertControllerStyleAlert]; 

     UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
     [alertController addAction:ok]; 
     [self presentViewController:alertController animated:YES completion:nil]; 


     }    
     break; 
    } 

    [self dismissViewControllerAnimated:controller completion:nil]; 
} 
+0

ありがとうございますが、それは私がすでに得ているものです。私は、この問題は基本的なVCに由来していると私は考えています。私は最初に空白のVCをMFMessageComposeVCを開き、そのデリゲートとして機能するスタックにプッシュし、メッセージが終了したときにポップすることで問題を回避することができました。 –

関連する問題