swift2 从坐标数组到表中的位置之间的距离

ozxc1zmp  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(222)

我试图用坐标数组中显示用户当前位置到位置的距离的行填充一个表。我在一个空数组中有坐标,还有用户的位置。
我坚持把坐标数组放进一个函数来计算距离,然后把每个距离值放进表行的标签中。任何见解都非常感谢。

var locationArray: [CLLocationCoordinate2D] = []
var shopperLocation = String()
var distanceText: [String] = []

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation:CLLocation = locations[0]

    shopperLocation = userLocation

    self.manager.stopUpdatingLocation()
}

//This is the function I am trying to use to get distance from the array of coordinates //

func distanceToLocation(){

    if locationArray == nil {

        locationArray = userLocation
    }

    let distanceBetween: CLLocationDistance =   shopperLocation.distanceFromLocation(startLocation) / 1609.34

    let distanceInMilesFromUser = String(format: "%.2f", distanceBetween)

    distanceText = "\(distanceInMilesFromUser) mi"
   }

  // Here I am trying to get the distance values in the correct rows //

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! listViewCell

    cell.myDistance.text = distanceText[indexPath.row]

    return cell
}
lokaqttq

lokaqttq1#

这是因为您必须显式地告诉表视图重新加载数据,也就是再次请求它的TableViewDataSource用新数据配置每个单元格。
你可以通过在CLLocationManager的委托方法中调用tableView.reloadData()来实现。下面的代码是实现这一点的一种方法。顺便说一下,有几点注意事项:

  • 我发现使用var myArray = [Type]()初始化数组比提供显式类型然后分配空数组更优雅
  • 您最好将商店参数(名称、坐标等)保存在结构体中
  • 跟踪当前用户位置而不是距离;这样做将使您能够轻松地添加新商店,而无需再次请求用户位置
  • 使用MKDistanceFormatter可以得到一个很好的人类可读的文本输出,为您的距离-这是非常强大的,将适应您的用户的区域设置和首选单位系统免费!

请不要忘记导入所有必需的模块:

import UIKit
import CoreLocation
import MapKit

定义常量:

let locationCellIdentifier = "LocationCell"

和结构体:

struct Shop {
    let name: String
    let coordinates: CLLocation
}

然后是视图控制器:

final class LocationTableView: UITableViewController, CLLocationManagerDelegate {

    var shops = [Shop]()
    var userLocation: CLLocation?
    let distanceFormatter = MKDistanceFormatter()

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        // Save the location and reloads table view
        if !locations.isEmpty {
            userLocation = locations.first
            manager.stopUpdatingLocation()
            tableView.reloadData()
        }
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return shops.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(locationCellIdentifier, forIndexPath: indexPath)

        // Configure the cell
        let shop = shops[indexPath.row]
        cell.textLabel?.text = shop.name

        if let userLocation = userLocation {
            let distance = shop.coordinates.distanceFromLocation(userLocation)
            let formattedDistance = distanceFormatter.stringFromDistance(distance)
            cell.detailTextLabel?.text = formattedDistance
        } else {
            cell.detailTextLabel?.text = nil
        }

        return cell
    }
}
jqjz2hbq

jqjz2hbq2#

这似乎有点粗糙的权利,所以我会尽量只是给予一个大纲的基础上,它似乎是你试图做什么和你似乎有问题。
首先,您有一个locationArray,但它是空的,我假设您将以某种方式填充它。
您还拥有一个distanceText数组,因此下面是您可以使用的一种建议方法。(所有这些都没有经过测试或验证,因此请将其视为伪代码)。
当您的位置更新时
1.获取上一个位置(最近的)
1.将当前位置数组Map到一个新的distanceText数组。
1.要求tableView重新加载它的数据。

var locationArray: [CLLocationCoordinate2D] = [] 
var distanceText: [String] = []

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation = locations.last
    distanceText = locationArray.map { location in 
        // add your code to calculated the distance and return it
        let distanceAsText = .......  // some function of location and userLocation
        return distanceAsText
    }
    tableView?.reloadData()        
}

相关问题