문제

해결: 사과에 제출하기 위해 새로운 프로젝트 에서이 버그를 재현하려고 노력하는 동안, 나는 그것이 iPhone OS 2.1에만 국한다는 것을 알게되었고 2.2에 대한 컴파일은 문제를 해결합니다. Stephen, 도와 주셔서 감사합니다. 버그가 여전히 존재했거나 2.2를 컴파일하지 않으면 효과가 있었기 때문에 귀하의 답변을 받아 들일 것입니다.


구식 레코드를 코드의 새 스타일 레코드로 변환 해야하는 방식으로 데이터베이스 스키마를 근본적으로 변경하는 앱이 있습니다. 사용자는이 앱에 많은 데이터를 저장할 수 있으므로 진행률 표시 줄이있는 모달 뷰 컨트롤러를 표시하고 데이터를 초과하는 (즉, 사용자가 가장 먼저 보는 것)를 표시하려고합니다. 이보기 컨트롤러 viewDidAppear: 데이터베이스 트랜잭션을 시작한 다음 실제 포팅을 수행하기 위해 배경 스레드를 시작합니다. performSelectorInMainThread:withObject:waitUntilDone: 전경 스레드에 진행률 표시 줄을 업데이트하도록 지시합니다.

문제는, viewDidAppear: 두 번 부르고 있습니다. "데이터베이스 바쁜"메시지로 "트랜잭션 시작"단계가 실패하기 때문에 이것을 알아 차렸다. 그러나 중단 점을 설정하면 실제로 두 번 ( -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:], 그리고 다시 -[UIViewController modalPresentTransitionDidComplete]. 이러한 이름은 개인 uiviewController 메소드 인 것처럼 보이므로 이것이 프레임 워크 버그라고 생각합니다.

두 개의 관련 코드 발췌문 (일부 관련없는 코드가 요약되었습니다) :

- (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에 버그 보고서를 제출해야합니까?

도움이 되었습니까?

해결책

나는 이것을 내 앱에서 보았다. 나는 그것을 완전히 확인한 적이 없지만, 이것이 일어나고 있다고 생각합니다.

  1. 루트보기를로드하십시오
  2. 로드 모달보기
  3. OS Sends View가 1 단계에서보기에 대한 알림이 나타났습니다.
  4. 그만큼 현재의 이 인스턴스에서 DatabaseController 클래스가 발생하는 컨트롤러보기
  5. OS는 모달 뷰에 대한 알림 알림을 보냈습니다.
  6. 현재보기 컨트롤러는 알림을받습니다. 이 경우 지난번과 똑같은 컨트롤러입니다.

제 경우에는 첫 번째 전화에서 일어난 일을 재설정합니다. viewDidAppear:.

귀하의 경우 두 가지 옵션이 떠오르고 있습니다. 이미 업그레이드를 시작했는지 여부를 추적하는 정적 변수; 또는 UIView* 시작하기 전에 매개 변수가 전달되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top