【问题标题】:Swift - Converting NSMutableArray to array of MKAnotationViewsSwift - 将 NSMutableArray 转换为 MKAnotationViews 数组
【发布时间】:2014-12-10 04:03:12
【问题描述】:

所以本质上,这就是我目前所拥有的。一个数组

var bars = [BarAnnotation(latitude: 42.022352, longitude: -93.650413, name: "Micky's Irish Pub", deal: "$2 Drinks 9PM-1AM"),

    BarAnnotation(latitude: 42.021948, longitude: -93.650348, name: "Cy's Roost", deal: "$2 Drinks 9PM-1AM")

我的自定义 BarAnnotation 类的数组。数组的大小显然是固定的。我一直在尝试从 JSON 文件加载条形数据,然后从那里创建数组。

func retrieveData(){

    var filePath = NSBundle.mainBundle().pathForResource("test", ofType: "json")
    var data = NSData.dataWithContentsOfMappedFile(filePath!) as NSData
    var json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

    var test = [] as NSMutableArray

    let barArray = json["bars"] as NSArray


    for bar in barArray{
        var name = bar["name"] as NSString
        var deal = bar["deal"] as NSString
        var lat = bar["lat"] as Double
        var long = bar["long"] as Double
        var negLong = -long

        var newBar = BarAnnotation(latitude: lat, longitude: negLong, name: name, deal: deal)

        test.addObject(newBar)


    }

    bars.arrayByAddingObjectsFromArray(test)
}

然后我想用这个数组“test”替换条。但是,test 是 NSMutableArray 类型,而 bar 是大小固定的 BarAnnotations 数组。当我尝试转换时,它会导致错误。我觉得这是一个简单的解决方法,我只是在这里遇到了困难。有人吗?

这是我的 BarAnnotation 类

class BarAnnotation: MKPointAnnotation {

var latitude, longitude, distance: Double
var name, imageName, deal: String
var location: CLLocationCoordinate2D
var loc: CLLocation
var annotation: MKPointAnnotation

init(latitude: Double, longitude: Double, name: String, deal: String) {
    self.latitude = latitude
    self.longitude = longitude
    self.name = name
    self.imageName = "image1.jpg"
    self.deal = deal
    self.distance = 0
    self.location = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    self.loc = CLLocation(latitude: latitude, longitude: longitude)
    self.annotation = MKPointAnnotation()
    annotation.setCoordinate(self.location)
    annotation.title = name
    annotation.subtitle = deal
}

然后我尝试在这里访问它

        for bar in bars {
        var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
        var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

        if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil {
            var span = MKCoordinateSpanMake(0.005, 0.005)
            var region = MKCoordinateRegion(center: bar.location, span: span)
            mapView.setRegion(region, animated: true)
            mapView.selectAnnotation(bar.annotation, animated: true)
        }
    }

这是错误

【问题讨论】:

  • “当我尝试转换它时会导致错误”您尝试了什么并确切地知道它导致了什么“错误”?
  • 当我遍历 bar 数组时,我尝试访问 BarAnnotation 的一个属性,即位置。但是,它不允许我访问该属性,因为 bar 数组曾经是 BarAnnotations 数组,而现在它是 NSMutableArray。
  • 你没有回答这个问题。你要不要帮助?我在您的代码中的任何地方都看不到 location 属性。我也没有看到您访问 bar 数组中任何内容的任何属性。显示导致问题的实际代码 - 而不是准备工作,是实际发生问题的实际代码! - 并说明确切问题出在确切哪一行。代码是否拒绝编译?你会崩溃吗?如果崩溃,崩溃日志是什么?
  • 那么这是唯一的编译错误还是众多错误之一?
  • 是的,这是唯一的错误。但是,如果我将其注释掉(这是搜索地图的代码),它会运行,但地图上不会加载任何注释。

标签: ios json swift nsmutablearray mkannotationview


【解决方案1】:

您的 BarAnnotation 既继承自 MKPointAnnotation 又声明了 MKPointAnnotation 的属性 - 这没有意义。我假设您正在添加 bar.annotation 作为地图视图的注释 - 由于 BarAnnotation 继承自 MKPointAnnotation 您可以只添加 bar 本身。

class BarAnnotation: MKPointAnnotation {

        var distance: Double
        var name, imageName, deal: String


        init(latitude: Double, longitude: Double, name: String, deal: String) {
            self.distance=0
            self.name = name
            self.imageName = "image1.jpg"
            self.deal = deal
            super.init()
            self.coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
            self.title = name
            self.subtitle = deal
    }

}

我发现的一件事是,即使 BarAnnotation 继承自 MKPointAnnotation,如果您尝试直接访问 coordinate 属性,Swift 也会给出弃用错误。解决方案是将对象转换为MKPointAnnotation

for bar in bars  {
    let annotation=bar as MKPointAnnotation
    var barName = bar.name.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

    var searchString = searchBar.text.stringByReplacingOccurrencesOfString("\'", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)

    if barName.rangeOfString(searchString) != nil || barName.lowercaseString.rangeOfString(searchString.lowercaseString) != nil {
        var span = MKCoordinateSpanMake(0.005, 0.005)
        var region = MKCoordinateRegion(center: annotation.coordinate, span: span)
        mapView.setRegion(region, animated: true)
        mapView.selectAnnotation(bar, animated: true)
    }
}

【讨论】:

  • 那么你得到了什么错误?您的屏幕截图中的错误消息与数组无关
  • 消息中的错误是因为未正确复制数组。新数组“test”是一个 NSMutableArray。当我尝试将 bar 数组(最初是 BarAnnotation 对象数组)设置为测试数组“bars.arrayByAddingObjectsFromArray(test)”时,我相信问题出在哪里,但我无法让它工作。
  • 这不是错误消息所说的。 NSArray 和 NSMutableArray 的内容没有“类型化”
  • 我知道,但是错误消息说的是 .location 值错误。那是因为它不允许我在当前栏上执行 .location。
  • 你试过 MKCoordinateRegionMake 了吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-03
  • 2016-06-06
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 2016-06-30
  • 2014-08-16
  • 2013-09-24
相关资源
最近更新 更多