iOS 5.1 + UISplitViewController в PortraitMode + UIActionSheet в MasterController = Ошибка подтверждения

У меня есть приложение, основанное на UISplitViewController, который показывает ActionSheet в MasterViewController в Split. До iOS 5.1 у меня не было проблем с представлением листа действий во всплывающем окне, представленном разделением, но теперь, очевидно, что-то не так с новым способом "вставки", показывающим MasterController.

Дело в том, что когда я пытаюсь представить ActionSheet, используя любой метод [actionSheet show..], приложение вылетает со следующей ошибкой (точное утверждение следующее).

*** Assertion failure in -[UIActionSheet presentSheetInPopoverView:], /SourceCache/UIKit_Sim/UIKit-1914.84/UIActionSheet.m:1816
sharedlibrary apply-load-rules all
Error in re-setting breakpoint 1:
Catchpoint 2 (throw)Error in re-setting breakpoint 1:
Error in re-setting breakpoint 1:
Current language:  auto; currently objective-c

Я гуглю это некоторое время, но никаких существенных ответов.. некоторые люди говорят, что это может быть ошибкой в ​​новом SplitViewController...

Идеи?

Заранее спасибо!

ОБНОВЛЕНИЕ: я отправил возможный общий обходной путь, проверьте это. Если это работает для вас, оставьте комментарий.... Если все в порядке, я отмечу это как правильное через пару дней

5 ответов

Исходя из вышеизложенного и с огромным уважением к инженеру Apple, который помогал мне в WWDC, вот решение, которое не только работает над этой ошибкой, но и указывает на нужную кнопку.

    if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
        [actionSheet showFromBarButtonItem:self.actionSheetBarButtonItem animated:YES];
    } 
    else 
    {
        CGRect windowsRect = [self.navigationController.toolbar convertRect:self.actionSheetBarButtonItem.customView.frame toView:self.view.window];

        [actionSheet showFromRect:windowsRect inView:self.view.window animated:YES];
    }

У меня тоже такая же проблема.

Один из обходных путей, который, по крайней мере, предотвращает сбой, - это показать ваш UIActionSheet следующим образом:

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    [self.actionSheet showFromBarButtonItem:sender animated:YES];
} else {
    [self.actionSheet showInView:self.view.window];
}

Таким образом, в портретном режиме лист действий отображается в центре окна. Не идеально, но, по крайней мере, оно не падает. А в ландшафтном режиме ведет себя как обычно.

Как прокомментировал OMZ, похоже, что эта проблема была решена в iOS 5.1.1 Apple. Поэтому я решил просто добавить его в раздел известных проблем журнала изменений для моего приложения, и обходной путь состоит в том, чтобы предложить пользователям перейти на iOS 5.1.1.

Я думаю, что следующее является общим решением, основанным на ответе Tap Form:

CGRect windowsRect = [actionSheetContainerView convertRect:viewToPresentActionSheet.frame toView:actionSheetContainer.window];
[actionSheet showFromRect:windowsRect inView:actionSheetContainer.window animated:YES];

Это повторно отправит actionSheet в окне, но будет указывать правильное направление

Другой вариант, чтобы сохранить эффект всплывающего окна, указывая на конкретную опцию, на самом деле вы можете сделать следующее: 1. Создайте свой собственный UIPopover 2. Создайте свой собственный UIViewController внутри UIPopover. 3. Отобразите таблицу UIActionSheet во вновь созданном UIViewController. 4. SetPopoverContentSize из размера UIActionSheet. 5. И наконец, подключите метод Click для вашего UIActionsheet, чтобы отклонить всплывающее окно.

Занимает немного больше кода, но дает вам те же функциональные возможности, которые были у вас по большей части, и имеет небольшой эффект вставки для UIActionsheet.

Другие вопросы по тегам