简体   繁体   中英

messageComposeViewController dismissing crash swift 3

On my App, I send alert via sms. I try to open a new view controller as a modal, and in this , the alert was sent. But, when the sms is sent or when user click on the cancel button, the messageComposeViewController do not dismiss, and crash.

Error on xcode log is :

(lldb)

紧急

This is my code used to send alerts :

import UIKit
import CoreLocation
import Social
import MessageUI
import BRYXBanner

class AlertInProgressViewController: UIViewController, MFMessageComposeViewControllerDelegate, CLLocationManagerDelegate {
[... Code here ...]

func sms()
    {
        //Send sms
        if(sms_exist()==true)
        {
            if( CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways)

            {

                locationManager.delegate = self
                locationManager.desiredAccuracy = kCLLocationAccuracyBest
                locationManager.requestWhenInUseAuthorization()
                locationManager.startUpdatingLocation()
                locationManager.startUpdatingHeading()


                let mlocation = self.locationManager.location

                if mlocation != nil {

                    let latitude: Double = mlocation!.coordinate.latitude
                    let longitude: Double = mlocation!.coordinate.longitude
                    let latitude_convert:String =  String(format:"%f", latitude)
                    let longitude_convert:String =  String(format:"%f", longitude)
                    let location = number_street + " " + ville + "\nLatitude " + latitude_convert + " - Longitude : " + longitude_convert
                    let geoCoder = CLGeocoder()
                    let location_details = CLLocation(latitude: mlocation!.coordinate.latitude, longitude: mlocation!.coordinate.longitude)
                    geoCoder.reverseGeocodeLocation(location_details)
                    {
                        (placemarks, error) -> Void in

                        let placeArray = placemarks as [CLPlacemark]!

                        // Place details
                        var placeMark: CLPlacemark!
                        placeMark = placeArray?[0]

                        // Address dictionary
                        print(placeMark.addressDictionary)

                        // Location name
                        if let locationName = placeMark.addressDictionary?["Name"] as? NSString
                        {
                            print(locationName)
                            self.details_location = locationName as String
                        }
                        if let city = placeMark.addressDictionary?["City"] as? NSString
                        {
                            self.city = city as String
                        }

                        self.message = NSLocalizedString("IN_DANGER_TEXT_SHARE",comment:"I'm in danger, I'm currently at  ") + location + "\n - " + self.details_location + " - " + self.city
                        let defaults = UserDefaults.standard
                        let sms_perso = defaults.object(forKey: "sms") as? String

                    if(MFMessageComposeViewController.canSendText()) {
                            let controller = MFMessageComposeViewController()
                            controller.body = self.message
                            controller.recipients = [sms_perso!]
                            controller.messageComposeDelegate = self
                            self.present(controller, animated: true, completion: nil)
                        }
                        else
                        {
                            print("Can't send sms")
                        }


                    }
                }
            }


        }

    }
[...]
func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {

        //Original code but doesn't work too
        //self.dismiss(animated: true, completion: nil)
        OperationQueue.main.addOperation {
            self.dismiss(animated: true, completion: {});
        }
        print("I want to dismiss here")
    }
}

In xcode log, I can see : I want to dismiss here, so messageComposeViewController is called but after it's crash.

To display AlertInProgressViewController I use a storyboard segue.

I resolve my problem by changing this :

self.dismiss(animated: true, completion: {});

by

controller.dismiss(animated: true, completion: nil)

Yes, in Swift 4.x you must use

controller.dismiss(animated: true, completion: nil)


Here's a useful delegate function for MFMailComposeViewControllerDelegate

// MAIL COMPOSER DELEGATE
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
        var resultMess = ""
        switch result.rawValue {
        case MFMailComposeResult.cancelled.rawValue:
            resultMess = "Mail cancelled"
        case MFMailComposeResult.saved.rawValue:
            resultMess = "Mail saved"
        case MFMailComposeResult.sent.rawValue:
            resultMess = "Thanks for contacting us!\nWe'll get back to you asap."
        case MFMailComposeResult.failed.rawValue:
            resultMess = "Something went wrong with sending Mail, try again later."
        default:break
        }

    // Show email result alert
            let alert = UIAlertController(title: APP_NAME, message: resultMess, preferredStyle: .alert)
    let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
    })
    alert.addAction(ok)
    present(alert, animated: true, completion: nil)

    // Dismiss the controller
    controller.dismiss(animated: true, completion: nil)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM