【问题标题】:Swift - searching through dictionaries in an array in a plistSwift - 在 plist 的数组中搜索字典
【发布时间】:2016-03-11 09:17:42
【问题描述】:

我正在制作一个简单的应用程序,该应用程序通过一个包含地理坐标的大型 plist 进行搜索,并带有相应的纬度和经度坐标。计划是能够在搜索框中搜索这些修复,然后按下按钮以定位地图视图,其中修复位于中心,并在精确坐标处放置一个图钉。

我有界面设置,地图工作,只需要启用按钮来搜索用户输入的修复,返回纬度,并将这些转发到地图。我已经在这里查看了几个小时的答案,并尝试了我没有运气的版本..

这是列表:

如您所见,有很多修复...解决此问题的最佳方法是什么?我不知道如何从这里继续下去。

这就是我用来定位地图的方法

func zoomToRegion() {
  let location = CLLocationCoordinate2D(latitude: 62, longitude: 16)
  let region = MKCoordinateRegionMakeWithDistance(location, 700000.0, 900000.0)

  mapView.setRegion(region, animated: true)
}

正如您现在看到的,我刚刚手动输入了经纬度,但它仍然有效。

我最接近使它工作的是遵循本指南:http://rshankar.com/how-to-add-mapview-annotation-and-draw-polyline-in-swift/ 但是我不希望修复在地图上,直到有人搜索它们,我无法转换该代码来做我想做的事想要..

感谢您对此的任何帮助或见解!

【问题讨论】:

    标签: ios arrays swift dictionary plist


    【解决方案1】:

    我宁愿将它们存储为 Double,但无论如何,您应该首先从该 .plist 创建一个 NSArray (Read from .plist) 然后过滤该数组,无论它是否存储用户输入的相同纬度和经度值。

    guard let filePath = NSBundle.mainBundle().pathForResource("YOUR_FILE_NAME", ofType: "plist"),    
    let locationsArray = NSArray(contentsOfFile:filePath) else {
        print("Couldn't load .plist as an array")
        return
    }
    
    // TODO: Replace them with the actual user input
    let userInputText: String = "ALABA"
    
    // It may not contain any items
    let filteredLocations = locationsArray.filter { (element) -> Bool in
        guard let title = element["title"] as? String where
          userInputText == title else { return false }
        return true
    }
    
    // To convert String lat & long to Double
    let numberFormatter = NSNumberFormatter()
    numberFormatter.decimalSeparator = ","
    
    // If you only need the first result:
    guard let locationDict = filteredLocations.first as? [String:AnyObject],
        let latString = location["lat"] as? String, 
        let longString = location["long"] as? String,
        let latitude = numberFormatter.numberFromString(latString)?.doubleValue,
        let longitude = numberFormatter.numberFromString(longString)?.doubleValue else {
           print("No result"); return
        }
    
    // Your location
    let location = CLLocationCoordinate2D(
        latitude: latitude, 
        longitude: longitude
    )
    
    // Do something with your location
    let region = MKCoordinateRegionMakeWithDistance(location, 700000.0, 900000.0)
    mapView.setRegion(region, animated: true)
    

    但是,如果您使用 .plist 中给定的属性实现一个类(例如 LocationData)会更好,并且您会创建一个 [LocationData] 数组,这样您就可以通过以下属性达到纬度和经度一个对象,而不是字典中的键。

    【讨论】:

    • 感谢您的快速回复!一件事我可能还不够清楚,我想要搜索的是修复程序或“标题”本身。在 plist 的图片中,我想搜索 ABALA 并获取该标题的经纬度。
    • 我更新了代码并希望这就是你要找的。​​span>
    • 我希望将 lat/long 转换为 double 而不是字符串。虽然不知道如何使用 plist 中的 466*2 字符串来做到这一点。问题是我还很缺乏经验,但正在学习。这个简单的应用程序对我有很大帮助,所以我有点想让它工作,然后我有很多时间学习更多,然后再尝试更进一步。不幸的是,您建议的代码对我不起作用,可能是因为我对正确实现它的理解不够。我尝试制作它的功能但没有运气。 “在声明之前使用局部变量位置”。
    • 根据您的 .plist 内容,更新的代码包含 String 到 Double 对话。如果您收到这样的错误,您可能在尝试达到它的值之前没有为您的“位置”变量分配任何值。您可以在“if”块中为其赋值,但不要在“else”块中为其分配任何值。
    • 做到了!我刚刚将 location 变量更改为 locationDict,现在它可以工作了,非常感谢。
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多