iPad crasht met UIActionSheet weergegeven van de child view-controller

Het spijt me als dit is gevraagd, maar ik kan het nergens vinden. Ik heb zelfs mijn probleem opnieuw gemaakt in een demoproject voor het geval een van jullie het uit de eerste hand wil zien, hoewel ik niet weet waar ik het moet plaatsen.

Ik heb een xibless op UINavigationController gebaseerde app. Sommige ViewControllers van mijn kind hebben bovenaan een knop aan de rechterkant die vervolgens een UIActionSheet weergeeft. Mijn app is ontworpen voor iPhone en iPad, dus als ik me klaarmaak om het UIActionSheet weer te geven, dan doe ik het volgende:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:[NSString stringWithFormat:@"%@ Menu", [self title]] delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Email", @"Print", nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleDefault];
if ([actionSheet respondsToSelector:@selector(showFromBarButtonItem:animated:)])
    [actionSheet showFromBarButtonItem:[[self navigationItem] rightBarButtonItem] animated:YES];
else [actionSheet showInView:[self view]];
[actionSheet release];

Op de iPad probeer ik het UIActionSheet aan de rechterknop van de balk te laten zien en op de iPhone moet het vanaf de onderkant naar binnen schuiven. Dit alles werkt prachtig.

Helaas, als u op de knop tikt en het menu op de iPad weergeeft, maar dan op de knop Terug in de linkerbovenhoek van de app tikt, wordt het menu niet gesloten. In plaats daarvan springt UINavigationController plichtsgetrouw terug en is het UIActionSheet er nog steeds. Als u iets in het menu probeert aan te raken, raakt u natuurlijk een crash. Als de gebruiker iets anders op het scherm zou hebben getikt in plaats van de knop Terug, wordt het menu correct afgewezen.

Als u deze test op de iPhone probeert, werkt alles zoals verwacht. Er is geen probleem.

Mijn demoproject heeft een AppDelegate en een ViewController en dat is het zo'n beetje. Het AppDelegate bouwt een NSDictionary van NSDictionaries, dus ik heb een model dat ik kan recursiveren om het probleem te demonstreren. De ViewController toont alle sleutels van het woordenboek en als de corresponderende waarde een NSDictionary is, kunt u erop tikken om naar beneden te gaan.

3

2 antwoord

Dit is een interessant probleem. Dit is wat de UIActionSheet Class Reference moet zeggen.

Op de iPad presenteert deze methode het actielijst in een popover en voegt toe   de werkbalk die de knop bezit naar de lijst met passthrough van de popover   keer bekeken. Tikken in de werkbalk resulteren dus in de actiemethoden van de   overeenkomstige werkbalkitems worden aangeroepen. Als je de popover wilt laten zien   worden afgewezen wanneer een ander werkbalkitem wordt aangeboord, moet u dit doen   implementeer dat gedrag in uw action handler-methoden.

Dus wanneer u het actiekaart weergeeft, wordt er automatisch een UIPopoverController gemaakt en wordt de werkbalk voor het bevatten (of de navigatiebalk) ingesteld als passthrough-weergave van de popover, zodat aanraakgebeurtenissen kunnen doorgaan. Ik denk dat de beste gok is om een ​​instantievariabele voor je actielijst te maken en het te dwingen om te sluiten als het zichtbaar is in -viewWillDisappear: .

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if (self.actionSheet.window)//If action sheet is on screen, window is non-nil
        [self.actionSheet dismissWithClickedButtonIndex:self.actionSheet.cancelButtonIndex animated:animated];
}
7
toegevoegd
Heel erg bedankt, Mark. Jij redt mijn dag. Ik heb urenlang met een soortgelijk probleem moeten worstelen. Je verdient een biertje.
toegevoegd de auteur Wayne Lo, de bron
Winnaar, winnaar, kip diner! Ik heb ook iets geleerd. Ik wist niet dat de eigenschap window alleen werd ingevuld toen het venster op het scherm werd weergegeven. Dank u zeer.
toegevoegd de auteur bmauter, de bron

Heb je geprobeerd het ActionSheet uit te schakelen bij viewWillDisappear?

Probeer dit:

// In MyViewController.m

    - (void)viewWillDisappear:(BOOL)animated {

        [actionSheet dismissWithClickedButtonIndex:nil animated:animated];

    }

* De crash klinkt als een mogelijke EXC_BAD_ACCESS. U kunt uw pointerverwijzing naar 'actionSheet' verliezen wanneer u van weergave verandert vanwege uw release. Het zou goed zijn om vast te houden aan een verwijzing naar actionSheet in uw .h-bestand en de timing van uw release te beheren.

*Also see the docs for info about the dismiss message: http://developer.apple.com/library/ios/#documentation/uikit/reference/UIActionSheet_Class/Reference/Reference.html

0
toegevoegd