해상도 : 새로운 프로젝트에서이 버그를 다시 작성하여 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에 버그 리포트를해야합니까?
위에서 언급했듯이 결국 OS 2.2에서 수정되었음을 발견했지만 제안 해 주셔서 감사합니다. –
문제 없습니다. "진짜"대답을 보는 것이 좋습니다! –