无法弄清楚如何使用 CLPlacemark 将我当前的位置正确嵌入到消息正文中

Posted

技术标签:

【中文标题】无法弄清楚如何使用 CLPlacemark 将我当前的位置正确嵌入到消息正文中【英文标题】:can't figure out how to embed my current location in message body correctly using CLPlacemark 【发布时间】:2015-11-03 14:53:36 【问题描述】:

几天前我几乎没有尝试将我当前的位置嵌入到我 iPhone 上的消息正文中,但我失败了。

我尝试了所有我的想法,但我只得到错误

我得到的最后一个错误是

"致命错误:在展开 Optional 时意外发现 nil 价值”

我创建了一个 CLPlacemark 的对象并将其设为可选,这意味着它可以有值或可以有 nil。

有什么方法可以用我当前的位置创建消息吗?

主菜单文件

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 对象,然后使用 CLLocationManager 对象的 startUpdatingLocation 方法更新您的当前位置。此外,您还必须实现以这种方式接收当前位置的委托方法。

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
    


获得位置坐标后,您可以进行反向地理编码以获取地标或确切地址。有关反向地理编码,请参阅 Reverse Geocode Location in Swift。关于您遇到的错误,您可以在创建消息之前检查地标对象是否为 nil。

【讨论】:

以上是关于无法弄清楚如何使用 CLPlacemark 将我当前的位置正确嵌入到消息正文中的主要内容,如果未能解决你的问题,请参考以下文章

无法弄清楚如何正确使用 KeyboardAvoidingView

无法弄清楚如何在 WebService 中使用参数 MaxReceivedMessageSize

无法弄清楚如何修复错误

无法弄清楚如何使用 NSTimer 更改视图

不推荐使用 each() 函数;无法弄清楚如何更改为 foreach [重复]

无法弄清楚如何通过仅使用类的函数删除整个链接列表