2014-12-20 4 views
1

iOS를 처음 사용했습니다. 사용자가 서로 다른보기 컨트롤러에서 위치를 업데이트 할 수있는 앱이 있습니다. 이 작업을 수행하는 코드의 양을 최소화하기 위해 노력하고 있으므로이를 구현하는 메서드를 복제하는 대신 모든 위치 관련 메서드를 별도의 클래스에 넣습니다.신속한 CLLocationManager를 사용하는 위치 클래스

import UIKit 
import CoreLocation 

class LocationUtil: NSObject, CLLocationManagerDelegate { 
    let locationManager = CLLocationManager() 

    func findUserLocation()->Void{ 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
     locationManager.requestWhenInUseAuthorization() 
     locationManager.startUpdatingLocation() 
    } 

저는이 클래스를 이렇게 부릅니다.

override func viewDidLoad() { 
     super.viewDidLoad() 
     let locUtil = LocationUtil() 
     locUtil.findUserLocation() 

} 

그러나 대리자 메서드가 호출되지 않습니다. 내가보기 컨트롤러에서 똑같은 코드를 직접 사용하면 잘 동작합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

문제는 LocationUtil 인스턴스를 할당 한 locUtil이 자동 변수 인 즉 viewDidLoad 기능에 국한된다는 것입니다. 따라서 viewDidLoad이 실행될 때 locUtil (및 사용자의 LocationUtil 인스턴스)이 존재하고 하나 이상의 행에 대해 존재하며 연기 퍼프에서 사라집니다. 따라서 LocationUtil 인스턴스는 위치 관리자와 같은 인스턴스 변수를 사용하여 다시 한번 파괴됩니다.

따라서 아무 일도 일어나지 않아도됩니다. 위치 관리자와 그 위임자는 약 백만 분의 1 초 동안 존재합니다. 너의 위치를 ​​알아낼만큼 길지는 않아!

+0

감사합니다. 어떻게 해결할 수 있습니까? – CraigH

+0

해결 방법은 locUtil을 로컬 변수가 아닌 View Controller의 인스턴스 변수 (속성)로 만드는 것입니다. 그러면 뷰 컨트롤러 자체가 살아있는 동안 지속성에 할당 할 내용을 모두 얻을 수 있습니다. – matt

+0

그러나 귀하가 물어 본 것은 아닙니다. 귀하의 질문은 그것을 올바르게하는 방법이 아니 었습니다. 너는 네가 뭘 잘못했는지 물었다. 내 대답은 그것을 설명했다. – matt

관련 문제