2

해상도 : 새로운 프로젝트에서이 버그를 다시 작성하여 Apple에 제출하는 동안 iPhone OS 2.1에만 해당되며 2.2 용으로 컴파일하면 문제. 스티븐, 도와 줘서 고마워. 버그가 여전히 존재하거나 2.2 용으로 컴파일 할 의향이 없다면 나는 그 대답을 받아 들일 것입니다.viewDidAppear : 시작 도중 표시된 모달보기 컨트롤러에서 두 번 호출됩니다.


나는 근본적으로 코드에서 새로운 스타일의 것들로 이전 스타일의 기록을 변환하는 저를 필요로하는 방식으로 데이터베이스 스키마를 변경하는 응용 프로그램을 가지고있다. 사용자는이 앱에 많은 양의 데이터를 저장할 수 있으므로 데이터를 포팅하는 동안 (즉, 사용자가 제일 먼저 보는 것처럼) 진행 막대가있는 모달 뷰 컨트롤러를 표시하려고합니다. 이 뷰 컨트롤러의 viewDidAppear:은 데이터베이스 트랜잭션을 시작한 다음 실제 포팅을 수행하기 위해 배경 스레드를 시작합니다.이 스레드는 종종 전진 스레드에게 진행률 막대를 업데이트하도록 알려주기 위해 performSelectorInMainThread:withObject:waitUntilDone:을 사용합니다.

문제는 viewDidAppear:이 두 번 호출된다는 것입니다. "트랜잭션 시작"단계가 "데이터베이스 사용 중"이라는 메시지와 함께 실패하지만 중단 점을 설정하면 실제로 번보다 두 번 호출됩니다 (한 번 -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]에 의해 다시 -[UIViewController modalPresentTransitionDidComplete]으로 나타남). 그 이름은 비공개 UIViewController 메서드 인 것으로 보이므로 프레임 워크 버그이거나 UIKit에서 수행 할 작업을 기대하고 있습니다.

두 관련 코드 발췌 (일부 관련이없는 코드가 요약되어) :

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    (register some default settings in NSUserDefaults) 

    // doing this early because trying to present a modal view controller 
    // before the view controller is visible seems to break it 
    [window addSubview:[self.navigationController view]]; 

    // this is the method that may present the modal view 
    [self.databaseController loadDatabaseWithViewController:self.navigationController]; 

    if(!self.databaseController.willUpgrade) { 
     [self restoreNavigationControllerState]; 
    } 
} 

그리고 내 DatabaseController 클래스

: 그래서

- (void)loadDatabaseWithViewController:(UIViewController*)viewController { 
    (open the new database) 

    (compute the path the old database would live at if it existed) 

    if([[NSFileManager defaultManager] fileExistsAtPath:oldDBPath]) { 
     (open the old database) 

     [viewController presentModalViewController:self animated:NO]; 
    } 
} 

, 여기 속이고있어 뭔가가있다 또는 Apple에 버그 리포트를해야합니까?

답변

3

내 응용 프로그램에서도 이것을 보았습니다. 나는 그것이 전적으로 확인도 없었어,하지만 난 이런 일이 무슨 생각 :

  1. 로드 루트보기
  2. 로드 모달보기
  3. OS보기
  4. 1 단계에서보기에 대한 알림을 표시 않았다 전송 이 경우에 DatabaseController 클래스 될 일 현재 뷰 컨트롤러는 최대를 선택합니다
  5. OS 뷰가 모달 뷰에 대한 알림을 표시 않았다 전송
  6. T 그는 현재보기 컨트롤러가 알림을받습니다. 이 경우 전회와 완전히 똑같은 컨트롤러입니다.

제 경우에는 처음 호출에서 일어난 일을 viewDidAppear:으로 재설정합니다.

두 가지 옵션이 있습니다 : 이미 업그레이드를 시작했는지 여부를 추적하는 정적 변수. 또는 시작하기 전에 전달 된 UIView* 매개 변수를 확인하십시오.

+0

위에서 언급했듯이 결국 OS 2.2에서 수정되었음을 발견했지만 제안 해 주셔서 감사합니다. –

+0

문제 없습니다. "진짜"대답을 보는 것이 좋습니다! –

관련 문제