Frage

Auflösung: Während diese Fehler in einem neuen Projekt neu zu erstellen versuchen, Apple einreichen, entdeckte ich, dass es auf das iPhone OS 2.1 spezifisch ist, und für 2.2 behebt das Problem zu kompilieren. Stephen, vielen Dank für Ihre Hilfe; Ich werde Ihre Antwort zu akzeptieren, da es, wenn der Fehler immer noch funktioniert hätte bestanden oder ich war nicht bereit, für 2.2 zu kompilieren.


Ich habe eine App, die radikal seine Datenbank-Schema in einer Weise verändert, die mich im alten Stil Aufzeichnungen zu neuen Stil diejenigen in Code zu verwandeln erfordert. Da die Benutzer eine Menge von Daten in diesen App speichern können, versuche ich mit einem Fortschrittsbalken einen modalen View-Controller angezeigt werden, während es Ports die Daten über (das heißt als erstes, was der Benutzer sieht). Dieses viewDidAppear: der View-Controller beginnt eine Datenbanktransaktion und startet dann einen Hintergrund-Thread die eigentliche Portierung zu tun, die performSelectorInMainThread:withObject:waitUntilDone: gelegentlich verwendet den Vordergrund Thread zu sagen, den Fortschrittsbalken zu aktualisieren.

Das Problem ist, viewDidAppear: zweimal aufgerufen wird. Ich bemerkte dies, weil der „eine Transaktion starten“ Schritt mit einer „Datenbank besetzt“ Nachricht fehlschlägt, aber ein Breakpoint Einstellung zeigt, dass es in der Tat zweimal einmal durch -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] genannt wird, wieder von -[UIViewController modalPresentTransitionDidComplete]. Diese Namen erscheinen private UIViewController Methoden sein, so dass ich vermute, dies ist entweder ein Framework Bug, oder ich mache etwas UIKit nicht erwartet mich zu tun.

Zwei entsprechende Code Auszüge (einige irrelevant Code zusammengefasst):

- (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];
    }
}

Und von meiner DatabaseController Klasse:

- (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];
    }
}

Also, gibt es etwas, das ich Verschrauben hier, oder soll ich einen Fehlerbericht mit Apple-Datei?

War es hilfreich?

Lösung

Ich sah dies auch in meiner app. Ich habe es nie ganz bestätigt, aber ich denke, das ist, was passiert:

  1. Laststammansicht
  2. Last modale Ansicht
  3. O sendet tat Ansicht Benachrichtigung für die Ansicht in Schritt 1
  4. erscheinen
  5. Die Strom View-Controller, die in diesem Fall geschieht Ihre DatabaseController Klasse sein, hebt es auf
  6. OS senden die Ansicht Benachrichtigung für die modal-Ansicht angezeigt hat
  7. Der aktuelle View-Controller erhält die Benachrichtigung. In diesem Fall ist es genau die gleiche Steuerung wie beim letzten Mal

In meinem Fall habe ich zurückgesetzt genau das, was in den ersten Aufruf zufällig viewDidAppear:.

In Ihrem Fall zwei Möglichkeiten in dem Sinne: eine statische Variable zu verfolgen, ob Sie die Aktualisierung bereits begonnen haben; schauen oder am UIView* Parameter übergeben vor dem Start.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top