簡體   English   中英

messageComposeViewController解雇崩潰swift 3

[英]messageComposeViewController dismissing crash swift 3

在我的應用程序上,我通過短信發送警報。 我嘗試打開一個新的視圖控制器作為模態,並在此發送警報。 但是,當發送短信或用戶點擊取消按鈕時,messageComposeViewController不會解除,並且崩潰。

xcode日志錯誤是:

(LLDB)

緊急

這是我用來發送警報的代碼:

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")
    }
}

在xcode日志中,我可以看到:我想在這里解雇,所以在調用messageComposeViewController但它崩潰之后。

要顯示AlertInProgressViewController,我使用了storyboard segue。

我通過改變這個來解決我的問題:

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

通過

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

是的,在Swift 4.x中你必須使用

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


這是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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM