刷新标记而不刷新整个Google地图(Swift 2.0,Xcode v 7.0.1)

时间:2015-10-29 03:20:24

标签: ios swift google-maps-markers google-maps-sdk-ios unrecognized-selector

我正在使用Swift 2.0中的Google Maps SDK构建一个在地图上显示公交车位置的应用。我有一个XML文件,每10秒更新一次,并显示所有活动穿梭机的拉特和长条。在我的代码中,我有标记对象,其中包含lats,long,ID和总线名称的字段。

我已经放置了显示地图的代码,该地图位于我想要显示总线的位置,而for循环遍历所有的总线位置,以便在地图上显示它们作为标记,在一个名为 realoadBuses的函数中()即可。在这个函数中,我还有一行与XML文件通信的代码。

我使用 NSTimer()每10秒调用 realoadBuses(),以便相应更新总线的位置。

以下是我的代码:

// runs reloadBuses() every 10 seconds
    timer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "reloadBuses", userInfo: nil, repeats: true)

func reloadBuses() {

    // displays the map adjusted on Campus
    let camera = GMSCameraPosition.cameraWithLatitude(37.0000,
        longitude: -122.0600, zoom: 14)
    let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
    mapView.mapType = kGMSTypeNormal
    mapView.myLocationEnabled = true
    self.view = mapView

    // XML file
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://link.to.xml.file.xml"))!)!

    let coord = Coord2()
    parser.delegate = coord
    parser.parse()
    print("coord has a count attribute of \(coord.count)")
    print("coord has \(coord.markers.count) markers")

    // loops through all the lats and lngs of the buses and produces a marker
    // for them on our Google Maps app
    for marker in coord.markers {
        print("marker id=\(marker.id), lat=\(marker.lati), lng=\(marker.lngi), route=\(marker.route)")

        // displays the buses
        let buses = GMSMarker()
        buses.position = CLLocationCoordinate2DMake(marker.lati, marker.lngi)
        buses.title = marker.route
        if buses.title == "UPPER CAMPUS" {
            buses.icon = UIImage(named: "uppercampus")
        } else if buses.title == "LOOP" {
            buses.icon = UIImage(named: "innerloop")
        }
        buses.snippet = marker.id
        buses.map = mapView
    }
}

我遇到的问题是,每次NSTimer()调用reloadBuses()时,地图都会与总线标记一起刷新。

我知道这是因为我有代码在reloadBuses()函数中显示地图。我试图在调用NSTimer()之前将那块代码放在某处,但是 mapView 超出了reloadBuses()内部for循环中最后一行所需的范围。 / p>

然后我尝试通过执行

将mapView传递给reloadBuses()
// displays the map adjusted on Campus
let camera = GMSCameraPosition.cameraWithLatitude(37.0000,
longitude: -122.0600, zoom: 14)
let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
mapView.mapType = kGMSTypeNormal
mapView.myLocationEnabled = true
self.view = mapView

// runs reloadBuses() every 10 seconds
timer = NSTimer.scheduledTimerWithTimeInterval(10.0, target: self, selector: "reloadBuses(mapView)", userInfo: nil, repeats: true)

reloadBuses(map: GMSMapView){
    ...
    for loop {
        ...
        buses.map = map
}

并且代码将成功构建并且地图将显示而没有任何标记(总线),但是在大约几秒钟之后应用程序将崩溃并且我将收到此错误:

**2015-10-28 19:42:05.731 GeoBus[1926:107070] -[GeoBus.ViewController reloadBuses(self.view)]: unrecognized selector sent to instance 0x7f91784aebc0
2015-10-28 19:42:05.743 GeoBus[1926:107070] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[GeoBus.ViewController reloadBuses(mapView)]: unrecognized selector sent to instance 0x7f91784aebc0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010600bf65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000107cd9deb objc_exception_throw + 48
    2   CoreFoundation                      0x000000010601458d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x0000000105f61f7a ___forwarding___ + 970
    4   CoreFoundation                      0x0000000105f61b28 _CF_forwarding_prep_0 + 120
    5   Foundation                          0x00000001063f1671 __NSFireTimer + 83
    6   CoreFoundation                      0x0000000105f6c364 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    7   CoreFoundation                      0x0000000105f6bf11 __CFRunLoopDoTimer + 1089
    8   CoreFoundation                      0x0000000105f2d8b1 __CFRunLoopRun + 1937
    9   CoreFoundation                      0x0000000105f2ce98 CFRunLoopRunSpecific + 488
    10  GraphicsServices                    0x0000000109e03ad2 GSEventRunModal + 161
    11  UIKit                               0x0000000106828676 UIApplicationMain + 171
    12  GeoBus                              0x0000000103ca7bfd main + 109
    13  libdyld.dylib                       0x000000010880292d start + 1
    14  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException**

1 个答案:

答案 0 :(得分:0)

是的,每次打电话都会重新创建地图:

let mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
mapView.mapType = kGMSTypeNormal
mapView.myLocationEnabled = true
self.view = mapView

我建议您改为在界面构建器中设置地图视图,并通过IB向您的班级添加插座的功能获得绑定。

关于移动标记,您需要做的是在代码中的数据结构中挂起标记并移动它们,而不是尝试在服务器的每次数据刷新时重新创建显示。