2012-08-07 1 views
3

내 뷰 컨트롤러의 initWithCoder 메서드 중 일부가 호출 된 경우를 발견했습니다. 전에 응용 프로그램 대리인에서 didFinishLaunching 메서드가 수행되었습니다. (중단 점을 설정하고 호출 순서를 확인하여이를 확인했습니다)viewController initialized * before * application didFinishLaunching

저는 스토리 보드를 사용하고 있습니다. UITabBarController는 초기 뷰 컨트롤러입니다. 문제의 일부는 스토리 보드가 알려지지 않은 순서로 객체를 생성한다는 것입니다. 아마도 앱이 실행되기 전에 뷰 컨트롤러를 생성 할 것입니다.

어쨌든 초기 사용자 기본값을 등록하는 것이 문제입니다. 이것은 프로그램의 어떤 부분이 그들을보기 전에 일어나야 만합니다. 그래서, 나는 먼저 등록 코드가 실행될 곳을 찾으려고 노력하고 있습니다.

같은 곳이 있습니까?

참고 : ...이 스레드가 조금에 대해 설명하지만, 결론은 정말이없는

ViewDidLoad runs before AppDelegate didFinishLaunchingWithOptions gets executed!

+0

나는 StackOverFlow에 익숙하지 않다는 것을 알았으므로 체크 마크를 눌러 대답을 선택하면 도움이되는 사람들을 도울 수있다. 그리고 정말로 대답이 마음에 들면 아래의 화살표를 탭하면된다. "대답". 이것은 모두 자발적이며, 당신이 이것을하지 않으면 아무 일도 일어나지 않습니다. 그러나 당신은 "받아 들여지는"평가를 얻습니다. 이것은 당신이 대답을 선택한 질문의 비율이고,이 숫자가 높을수록 미래에 더 많은 사람들이 당신을 도울 것입니다. –

답변

4

사용자 기본 설정을 초기화하는 표준 방법은 앱 위임의 방법 "초기화 + (무효)"는에이 어떤 대리자 메서드는 메세지가되기 전에 실행을 보장

+ (void)initialize 
{ 
    if(self == [MyAppDelegate class]) { 
     ... 
    } 
} 

.

추신 : 나는 그 방법에서 돌아 오기 전에 내 didLaunch 메소드에서 전체 viewController 인스턴스를 인스턴스화합니다.

+0

완벽한 - 그게 내가 찾고 있던 바로 그거야. 감사! –

+0

루트보기 컨트롤러가로드되기 전에 실행됩니까? – jasongregori

+0

예 - 초기화는 인스턴스가 메시지를 받기 전에 런타임에 의해 호출됩니다. 따라서 applicationDidLaunch ...와 친구들 전에 보내야합니다. –

0

이 (인터페이스 빌더를 사용하여 짜증 ​​하나의 이유도 등) 자연이다. 응용 프로그램에서 : didFinishLaunchingWithOptions : 일반적으로 해당 NIB/XIB 파일에서 이미 생성 된 기본 창 및 주보기 컨트롤러를 사용합니다. 두 가지 해결책 :

하나 (선호) : 응용 프로그램에서 물건을 수동으로 인스턴스화합니다 : didFinishLaunchingWithOptions :. 따라서 초기화의 실행 순서를 제어 할 수 있습니다.

두 가지 : __attribute__((constructor(XXX))) 함수를 사용하십시오. main 함수를 호출하기 전에 함수를 호출해야하며, 특정 생성자 함수가 호출되기 전에 XXX 번호가 더 낮아야합니다. 그러나이 방법은 표준 C (컴파일러 확장 기능 만)가 아니기 때문에 바람직하지 않으며 쉽게 혼동 될 수 있습니다.