2 Stimmen

EXC_BAD_ACCESS beim Beenden des modalViewControllers iOS5

Ich zerbreche mir schon seit langem den Kopf und versuche, dieses Problem zu lösen. Ich habe StackOverflow durchsucht und habe Leute gefunden, die nach etwas fragen, das meinem Problem ähnelt wie diese Frage y diese Frage aber keine der gegebenen Antworten hat mir geholfen.

Um das Problem im Detail zu erklären:

  1. Ich habe Apples Paging-Beispiel verwendet, um das Blättern zwischen View-Controllern zu ermöglichen

  2. Die Ansichtshierarchie sieht folgendermaßen aus: UIWindow -> UIScrollView (MainController) -> UIViewControllers.

    Ich verwende diesen Code, um einen Delegaten für den Viewcontroller zu erstellen, der die UISCrollview enthält:

    if(page == 0)
    {
        ContractsViewController *controller = [viewControllers objectAtIndex:page];
    
        if ((NSNull *) controller == [NSNull null])
        {
            controller = [[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil];
            controller.delegate = self;
            [viewControllers replaceObjectAtIndex:page withObject:controller];
            [controller release];
        }
    
        // add the controller's view to the scroll view
        if (controller.view.superview == nil)
        {
            CGRect frame = scrollView.frame;
            frame.origin.x = frame.size.width * page;
            frame.origin.y = 0;
            controller.view.frame = frame;
            controller.view.tag = 0;
            [scrollView addSubview:controller.view];
    
        }
    }

Das Problem tritt dann auf, wenn ich versuche, einen modalviewcontroller von meinem ViewController innerhalb der scrollview mit dem Delegaten zu präsentieren. Es funktioniert ein paar Mal, aber dann gibt mir eine EXC_BAD_ACCESS. Ich habe auch versucht, eine Benachrichtigung zu posten und einen Listener im MainController zu erstellen, um es auf diese Weise zu präsentieren, aber immer noch das gleiche Problem.

Beim Testen in iOS 4.3 alles funktioniert wie ein Charme, aber in iOS5 bekomme ich das Problem.

Ich hoffe, jemand kann mir helfen, dieses Problem loszuwerden.

Ich danke Ihnen im Voraus.

1voto

Krueger Punkte 485

Zunächst einmal vielen Dank für alle Antworten! Ich habe endlich die Lösung für mein Problem gefunden.

Wie in meiner Frage erwähnt, habe ich Apples Pagecontrol-Beispiel als Vorlage für mein Projekt. Diese Vorlage hat einen RootViewController, der eine XIB mit einem Fenster hat, das eine UIScrollview und ein Pagecontrol enthält.

Das Problem trat auf, als ich versuchte, die ModalView von einem UIViewController innerhalb der Scrollview zu präsentieren. Ich wollte den Delegaten verwenden, um es durch den RootViewController zu präsentieren, fand aber heraus, dass es die UIScrollview verwendet, um es zu präsentieren.

Das UIScrollView-Objekt wurde offenbar nicht beibehalten, so dass ich nach ein paar Abbrüchen den EXC_BAD_ACCESS erhielt.

Ich habe dann herausgefunden, dass ich eine UIView im rootViewController benötige, und habe sie in der unteren Viewhierachie in der XIB platziert, und sie mit der View des rootViewControllers verbunden. Nachdem ich das getan hatte, konnte ich [delegate present ] und [delegate dismiss ] im UIViewController ohne EXC_BAD_ACCESS verwenden.

Juhu! :)

0voto

Ankit Srivastava Punkte 12216

Ich glaube, ich verstehe Ihr Problem in der ersten, wenn Sie freigeben controller Objekt und dann versuchen Sie, es in der zweiten if-Schleife zu verwenden, weshalb Sie dies erhalten. geben Sie das Controller-Objekt frei, nachdem beide if-Schleifen durchlaufen wurden.

エディトリアル :

versuchen Sie stattdessen diesen Code.

if(page == 0)
{
    ContractsViewController *controller = [viewControllers objectAtIndex:page];

    if ((NSNull *) controller == [NSNull null])
    {
        controller = [[[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil]autorelease];
        controller.delegate = self;
        [viewControllers replaceObjectAtIndex:page withObject:controller];
    }

    // add the controller's view to the scroll view
    if (controller.view.superview == nil)
    {
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * page;
        frame.origin.y = 0;
        controller.view.frame = frame;
        controller.view.tag = 0;
        [scrollView addSubview:controller.view];

    }
}

0voto

Ich schlage vor, dass Sie Ihre [controller release]; und das Hinzufügen einer automatischen Freigabe: controller = [[[ContractsViewController alloc] initWithNibName:@"ContractsView" bundle:nil] autorelease]; Sie besitzen nicht controller wenn es von objectAtIndex: auf diese Weise könnten Sie das gleiche Verhalten für beide Controller haben, keine Freigaben.

0voto

JeremyP Punkte 81782

Versuchen Sie, den Code mit NSZombiesEnabled auszuführen.

Meine Vermutung ist, dass das viewControllers-Objekt entweder nie initialisiert wird oder vorzeitig freigegeben wird.

Außerdem gibt es diese if (page == 0) Seltsamkeiten:

if(page == 0) // <== only the first page ever gets the init code calling
{
    ContractsViewController *controller = [viewControllers objectAtIndex:page];

    if ((NSNull *) controller == [NSNull null])
    {
        // ** SNIP **

        [viewControllers replaceObjectAtIndex:page   // <<=== always 0
                                   withObject:controller];
        [controller release];
    }

    // ** SNIP **

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X