Не могу понять, как правильно вставить мое текущее местоположение в тело сообщения с помощью CLPlacemark

Несколько дней назад я с трудом пытался встроить свое текущее местоположение в тело сообщения на моем iPhone, но мне это не удалось.

Я перепробовал все, что у меня на уме, но я получил только ошибки

Последняя ошибка, которую я получил,

"Неустранимая ошибка: неожиданно найден ноль при развертывании необязательного значения"

Я создал объект CLPlacemark и я сделал это необязательным, что означает, что он может иметь значение или может иметь ноль.

Есть ли способ создать сообщение с моим текущим местоположением?

Файл MainMenu

import UIKit
import Social
import MessageUI
import Foundation
import CoreLocation


class MainMenu: UIViewController , MFMessageComposeViewControllerDelegate , UINavigationControllerDelegate , MFMailComposeViewControllerDelegate, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {
    }

    let placeMarks = Location()

    @IBAction func TapOnEmergency(sender: UIButton) {

       let textMessageRecipients = ["+123456789"]

       let messageComposer = MFMessageComposeViewController()

       let Emergency  = UIAlertController(title: "Do You Need Help ?", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

       let Yes = UIAlertAction(title: "YES", style: .Default) { (action) in

            if (MFMessageComposeViewController.canSendText()) {

                messageComposer.messageComposeDelegate = self
                messageComposer.recipients = textMessageRecipients

                messageComposer.body = "I'm Lost, I need some Help, Here's my Location \(self.placeMarks.currentLocation!.country)"

                self.navigationController?.presentViewController(messageComposer, animated: true){}
                self.presentViewController(messageComposer, animated: true, completion: nil)
                self.messageComposeViewController(messageComposer, didFinishWithResult: MessageComposeResultCancelled)



            } else {

                let errorAlert = UIAlertController(title: "Cannot Send Text Message", message: "Your device is not able to send text messages.", preferredStyle: UIAlertControllerStyle.Alert)

                            errorAlert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil))

                            self.presentViewController(errorAlert, animated: true, completion: nil)

            }



            let Options  = UIAlertController(title: "Do You Want to Call Your Supervisor ?", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet)

            let dialNumber = UIAlertAction(title: "YES", style: .Default) { (action) in

            let call:NSURL = NSURL(string: "tel://123456789")!
            UIApplication.sharedApplication().openURL(call)

            }

            Options.addAction(dialNumber)

            let Dismiss = UIAlertAction(title: "Dismiss", style: .Destructive) { (action) in

            }

            Options.addAction(Dismiss)


            self.presentViewController(Options, animated: true) {}


        }

        Emergency.addAction(Yes)

        let No = UIAlertAction(title: "Dismiss", style: .Destructive) { (action) in

        }

        Emergency.addAction(No)

        self.presentViewController(Emergency, animated: true) {}

    }
}

Файл местоположения

import UIKit
import CoreLocation

class Location: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()
    var currentLocation : CLPlacemark?
}

1 ответ

Просто создание CLPlacemark не выберет местоположение для вас. Вам нужно будет создать объект CLLocationManager, а затем обновить текущее местоположение, используя метод startUpdatingLocation объекта CLLocationManager. Также вам нужно будет реализовать методы делегата для получения текущего местоположения таким образом.

import UIKit
import CoreLocation

class Location: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()
    var currentLocation : CLPlacemark?
    var locationManager = CLLocationManager()

    private override init() {
        super.init()
        locationManager.delegate = self
    }
    func updateLocation()
    {
        locationManager.startUpdatingLocation()
    }
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        locationManager.stopUpdatingLocation()
        let location  : CLLocation = locations.last as CLLocation!
        //use reverse geocoding to get the address from location coordinates you got
    }

}

Как только вы получите координаты местоположения, вы можете выполнить обратное геокодирование, чтобы получить метку места или точный адрес. Обратитесь к Местоположение обратного геокода в Swift для обратного геокодирования. Что касается ошибки, которую вы получаете, вы можете проверить, является ли объект метки нуля, прежде чем создавать сообщение.

Другие вопросы по тегам