UIActionSheet: Bug in iOS8 auf iPads

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIActionSheet: Bug in iOS8 auf iPads

    Hallo,

    ich bin gerade auf folgenden Bug in iOS 8 gestoßen, vielleicht hilft's ja den einen oder anderen und vermeidet graue Haare:

    1. Gegeben eine iPad-Anwendung, basierend auf Master/Detail mit UISplitviewController, Deployment-Target ist iOS7, SDK ist iOS8.

    2. Die Anwendung hat in der Toolbar des MasterViewControllers ein BarButtonItem. Mit Tap auf das Item wird ein UIActionSheet angezeigt.

    3. Unter iOS7 funktioniert das in Landscape und Portrait.

    4. Unter iOS8 bekomme ich in Portrait eine Exception:

    ​UIAlertController (<UIAlertController: 0xfb23ad0>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'


    5. In Landscape funktioniert's.

    Blöd, also habe ich mir gedacht verwende ich eben unter iOS8 den neuen UIAlertController, da ist's aber genau andersrum. Der geht nicht in Landscape aber in Portrait :cursing: ?( :thumbdown:

    Da habe ich wieder eine Exception:

    ​*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0xe4085a0>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'


    Das Dumme ist nur, der Lösungsvorschlag geht nicht. Da ich an den popoverPresentationController des UIAlertControllers gar nicht komme: Bei der Erzeugung ist er noch nil und später komme ich nicht mehr hin :(

    Wie stellt Apple sich das vor, wie das gehen soll?

    schönen

    Gruß

    gandhi
  • Mmmh, also ich nutze in meiner App genauso ein UIActionSheet nach Touch auf einem BarButtonItem ... SDK iOS 8, Deployment Target iOS7 ... und es funktioniert wie erwartet. Okay, die Klasse ist mit iOS 8 deprecated, aber das ist ja erst einmal kein Problem. Der entsprechende ViewController implementiert

    Quellcode

    1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    2. {
    3. return YES;
    4. }

    und das Sheet wird einfach per

    Quellcode

    1. UIActionSheet *tmpActionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:buttonTitle otherButtonTitles:nil];
    2. [self setDeleteActionSheet:tmpActionSheet];
    3. ...
    4. [[self deleteActionSheet] showFromBarButtonItem:sender animated:NO];

    aufgerufen.

    Du räumst nicht zufällig irgendwo den BarButtonItem weg?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Nein, und wie gesagt. das tritt nur auf dem iPad im Portrait-Modus (d.h. wenn der MasterViewController so leicht von links reingeschoben ist) bei einer Master/Detailview-Anwendung mit UISPlitviewController auf, wenn das BarButtonItem in der Toolbar des MasterViewControllers liegt. Alle andere Fälle (auch iPhone) gehen.

    ciao

    gandhi
  • Gibt es inzwischen eine Lösung für das Problem, ich hänge momentan an der gleichen Stelle:
    - iPad - Splitview mit Toolbar im Masterview
    - UIActionSheet erscheint im Landscape-Mode
    - App crashed im Portraitmode bei "herausgeschobenem" Masterview

    Danke im vorus
    bin gerade am verzweifeln.
  • Nein, ich hoffe immer noch, dass Apple das fixt. Schreib' doch auch mal einen Bugreport.

    Die Ursache liegt m.E. Darin, dass UiActionSheet in IOS8 deprecated ist und von der neuen Implementierung sozusagen nachgebildet wird und das verhält sich halt anders. Schon mal versucht aus einer UIActionSheet-Delegate Methode unter iOS 8 einen neuen ViewController zu präsentieren? Das geht auch nicht mehr

    ciao

    gandhi
  • Ja, damit geht's. Das war das erste, was ich versucht hatte. Legt die Fehlermeldung ja auch nahe. Aber das ist nicht das Problem. Das Problem ist, dass Apple in iOS8 das Verhalten von bestehenden Klassen fundamental geändert hat. Und das ist, gelinde gesagt, Scheiße. Was in iOS 7 funktioniert, muss auch in iOS8 funktionieren.

    Aber, wir reden hier von zwei Problemen:

    1. Präsentation von ViewControllern in UIActionSheet-Delegate-Methoden. Da gibt's eine einfache Lösung z.B. mit dispatch_async() (s.o.)

    2. Das Landscape-UISPlitView-Problem mit dem BarButtonItem, beschrieben im ersten Post von mir. Da habe ich noch keine Lösung <X Ich hoffe auf einen Bugfix

    schönen Gruß

    gandhi