2013-01-18 5 views
2

UITapGestureRecognizer를 사용하여 (수직으로) 탭을 확장하고 UIPanGestureRecoginizer를 사용하여 팬의 API 호출을 시작하는 MKMapView가 있습니다. 모든 것이 잘 작동했다 다시 약간의 시간이 될 때까지, 어디 패닝에 앱이 (내가 이해할 수 또는 정보) 거의 유용한 정보MKMapView setRegion : 애니메이션 : 응용 프로그램이 충돌 함 (편집 됨)

예외 중단 점에, 그리고 좀비 오브젝트가되었습니다로 충돌 할

사용하도록 설정되었습니다. 충돌시에는 예외 중단 점에 절대 도달하지 않습니다!

다음은 로그입니다. (패닝 시작, 패닝, 패닝 종료가 팬 제스처 인식기 상태에 따라 인쇄 됨). 패닝이 끝나면 바로 앱이 다운됩니다. (지도는 모든 타일을로드 아직, 그리고 regionDidChangeAnimated 아직 호출되지 않습니다) : 여기

2013-01-17 14:46:04.396 MyApp[13126:c07] Panning Began 
2013-01-17 14:46:04.412 MyApp[13126:c07] Panning 
2013-01-17 14:46:04.412 MyApp[13126:c07] Panning 
2013-01-17 14:46:04.557 MyApp[13126:c07] Panning 
2013-01-17 14:46:04.606 MyApp[13126:c07] Panning 
2013-01-17 14:46:04.691 MyApp[13126:c07] Panning Ended 
2013-01-17 14:46:04.692 MyApp[13126:c07] *** -[MKMapViewPositioningChange hasChanges]: message sent to deallocated instance 0x139f7520 

내가 충돌 후 볼 수있는 역 추적입니다 :

(lldb) bt 
* thread #1: tid = 0x1c03, 0x02a4fa97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) 
    frame #0: 0x02a4fa97 CoreFoundation`___forwarding___ + 295 
    frame #1: 0x02a4f94e CoreFoundation`_CF_forwarding_prep_0 + 14 
    frame #2: 0x01244d27 MapKit`-[MKMapView(UserPositioningInternal) _runPositioningChange] + 2037 
    frame #3: 0x01242dd7 MapKit`-[MKMapView(UserPositioningInternal) _runPositioningChangeIfNeeded:] + 86 
    frame #4: 0x01240220 MapKit`-[MKMapViewInternal runPositioningChangeIfNeeded] + 50 
    frame #5: 0x01e2eb90 Foundation`__NSFireTimer + 97 
    frame #6: 0x02a1f376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 
    frame #7: 0x02a1ee06 CoreFoundation`__CFRunLoopDoTimer + 534 
    frame #8: 0x02a06a82 CoreFoundation`__CFRunLoopRun + 1810 
    frame #9: 0x02a05f44 CoreFoundation`CFRunLoopRunSpecific + 276 
    frame #10: 0x02a05e1b CoreFoundation`CFRunLoopRunInMode + 123 
    frame #11: 0x03c897e3 GraphicsServices`GSEventRunModal + 88 
    frame #12: 0x03c89668 GraphicsServices`GSEventRun + 104 
    frame #13: 0x0132d65c UIKit`UIApplicationMain + 1211 
    frame #14: 0x0001223d MyApp`main + 141 at main.m:16 
    frame #15: 0x00002fc5 MyApp`start + 53 

은 충돌 순간 멀리 내가 갈 PanGestureRecognizer 액션 메소드에 대한 연결을 만듭니다.

제스처 인식기를 사용하는 중에이 충돌을 제거 할 수있는 방법이 있습니까? 또는 GestureRecognizers를 사용하지 않고지도가 탭되고 패닝되었음을 알 수있는 방법이 있습니까?

도움/질문/답변/의견 감사합니다!


업데이트 (1 월 19 일) : 팬 제스처 인식기에서 전혀 문제가되지 않는 것 같습니다. 이제 mapview에 새로운 주석을 추가하려고 시도한 후 충돌이 발생합니다. [MapView setRegion : animated :]를 호출하고 regionDidChangeAnimated가 충돌하기 직전에 충돌합니다. [MKMapViewPositioningChange hasChanges]와 동일한 충돌이 발생한 시점에서 로그가 기록됩니다. .


업데이트 (1 월 23 일) : 무슨 일이 일어 났는지 나는 확신합니다. MKMapView의 보이는 사각형에 모든 주석을 포함하도록 영역을 설정하려고하는 코드와 [myMapView removeAnnotations : [myMapView annotations]]를 호출하는 몇 개의 다른 위치가 있습니다. 그리고 내 생각에이 두 가지 행동은 심한 공중 충돌로 끝나며 충돌로 이어지는 흔적을 남기지 않습니다. 내가 직감이 고침을 통과하면 대답이 업데이트됩니다. QA

답변

2

내가 이전에 짐작했던 것처럼 (두 번째 질문에 대한 업데이트), 추가하는 동안지도 영역을 설정하여 모든 주석을 표시하고 제거하는 데 문제가있었습니다. 모든 주석을 동시에. setRegion : animated :를 호출하는 경우 mapView에 적어도 하나 이상의 주석이 있는지 확인해야합니다.

또한 특히 주석을 기반으로지도에서 어떤 유형의 애니메이션을 수행하는 경우 다음 코드를 적절하게 사용하면 도움이됩니다.

[MKMapView removeAnnotations : [MKMapView annotations]];