我是Swift语言的新手。我创建了一个MapKit应用程序,它从Sqlite DB(最新的FMDB堆栈)递归检索MKPointAnnotation
数据(lat,log和title)。
目的是在MKMapViewDelegate
上加上一堆兴趣点。我已经尝试了w / out数组,但是mapView.addAnnotation
会覆盖任何一点并且只显示地图上的最后一个,所以我正在尝试使用数组。
我已经创建了一个函数,但是当调用wpoint数组时,我在运行时得到错误“致命错误:无法索引空缓冲区”。
以下是代码:
func initializeRoute()
{
sharedInstance.database!.open()
var resultSet: FMResultSet! = sharedInstance.database!.executeQuery("SELECT * FROM Route", withArgumentsInArray: nil)
// DB Structure
var DBorder: String = "order" // Int and Primary Index
var DBlatitude: String = "latitude" // Float
var DBlongitude: String = "longitude" // Float
// Array declaration
var wpoint: [MKPointAnnotation] = []
// Loop counter init
var counter: Int = 0
if (resultSet != nil) {
while resultSet.next() {
counter = counter + 1
wpoint[counter].coordinate = CLLocationCoordinate2DMake(
(resultSet.stringForColumn(String(DBlatitude)) as NSString).doubleValue,
(resultSet.stringForColumn(String(DBlongitude)) as NSString).doubleValue
)
wpoint[counter].title = resultSet.stringForColumn(DBorder)
mapView.addAnnotation(wpoint[counter])
}
}
sharedInstance.database!.close()
}
println ("Coordinate = \(wpoint.coordinate)")
显示所有数据,我在数组声明中弄乱了......
答案 0 :(得分:3)
数组声明:
var wpoint: [MKPointAnnotation] = []
创建一个空数组(零元素)。
然后,正如Swift documentation所说:
使用下标:
无法在数组中插入其他项目
这就是你得到"致命错误的原因:无法索引空缓冲区"稍后在这一行出错:
wpoint[counter].coordinate = ...
相反,正如文档中所述,使用append
方法或+=
运算符。
无论哪种方式,您都需要在每次迭代时创建一个MKPointAnnotation
对象,设置其属性,将其添加到数组中,然后将其传递给addAnnotation
。例如:
var wpoint: [MKPointAnnotation] = []
if (resultSet != nil) {
while resultSet.next() {
let pa = MKPointAnnotation()
pa.coordinate = CLLocationCoordinate2DMake(
(resultSet.stringForColumn(String(DBlatitude)) as NSString).doubleValue,
(resultSet.stringForColumn(String(DBlongitude)) as NSString).doubleValue
)
pa.title = resultSet.stringForColumn(DBorder)
wpoint.append(pa)
//wpoint += [pa] //alternative way to add object to array
mapView.addAnnotation(pa)
}
}
请注意其他一些事项:
wpoint
数组首先不是必需的,因为您使用addAnnotation
(单数)一次添加一个注释,而代码在wpoint
处没有做任何其他事情wpoint
并在地图中添加注释"那么在循环中,你应该只将注释添加到数组然后 在 循环之后,调用addAnnotations
(复数)一次并将整个数组传递给它。counter
作为数组索引的原始代码假设第一个索引是1
(counter
已初始化为0
,但它在顶部递增的循环)。在Swift和许多其他语言中,数组索引是从零开始的。initializeRoute
方法自称。