2014-03-01 2 views
0

아래에 표시된대로 초기화 함수를 선언하는 클래스 A가 있습니다. AppDelegate applicationDidBecomeActive에서 호출됩니다.위치 변경시 iOS 호출 함수가 예외를 throw 함

이제 응용 프로그램이 백그라운드로 이동하면 사용자의 현재 위치를 캡처하고 있습니다. 응용 프로그램이 포 그라운드로 오면 새 위치가 표시되고 사용자가 주어진 거리 이상으로 이동 한 경우 다시 초기화를 호출하여 mainviewcontroller을 튀기고 데이터를 다시 계산합니다.

mvc = ... 줄에 예외가 발생합니다. "응용 프로그램이 백그라운드에서 실행되지 않습니다"를 YES으로 설정하면 거리에 따라 초기화를 호출하지 않으면 초기화해도 문제없이 호출됩니다. 어떤 도움을 많이 주시면 감사하겠습니다!

예외는 다음과 같습니다

[_UIModalItemAppViewController viewControllers]: unrecognized selector sent to instance

나는이 :

.... 
UINavigationController *n ; 
MainViewController *mvc; 
.... 
.... 

+(void)refetch 
{ 

static BOOL initialized = NO; 
n = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController; 
mvc = (MainViewController *)[n viewControllers][0]; 

if (!initialized) 
{ 
    initialized = YES; 
    calculatedValuesArray = [[NSMutableArray alloc] init]; 
    [self updateLocation]; 
    [self fetchData]; 
} 
} 
+1

절대 '초기화'를하지 마십시오. 이것은 클래스에 대한 참조가 처음 존재할 때 런타임에 의해 호출 될 표준 Objective-C 메소드입니다. – rmaddy

+0

감사합니다. 다시 계산을 다른 함수로 옮기고 그 함수를 호출하는 것으로 충분합니까? 아마도 – rkh

+0

. 그러나 오류로 인해,'rootViewController'는 여러분이 생각하는 것과 다릅니다. 앱이 백그라운드에서로드 된 경우 'rootViewController'는 예상되는 nav 컨트롤러가 아닌 일부 개인 클래스입니다. – rmaddy

답변

1

keyWindow 당신이 기대 창없는 것 같다 그것은 개인 뷰 계층이 포함되어 있습니다. 대신 앱 대리인의 창 ([UIApplication sharedApplication].delegate.window)을 사용해보세요.

+0

레오 감사합니다. 내가 그것을 바꿨을 때 또 다른 에러가 발생했다.'- [UIWindow viewControllers] : 인식 할 수없는 selector' – rkh

+1

@rkh'.rootViewController'를 호출하는 것을 잊었다. ;) –

+1

:) 무슨 실수 야. 빠른 응답 및 붙잡기를위한 감사합니다! – rkh

-1

문제는 여기에 있습니다 :

n = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController; 
mvc = (MainViewController *)[n viewControllers][0]; 

n 변수가 바르 viewControllers이 없습니다.

+1

1) 질문에 대답하지 않습니다. 2)이 코드는'viewController'라는 이름의 ivar에 접근하지 않습니다. 'viewController'라는 메소드를 호출하려고 시도합니다. 보통 코드는 루트 뷰 컨트롤러가 실제로 'UINavigationController'라고 가정하기 때문에 정상적으로 작동합니다. – rmaddy

관련 문제