iOS 5.1 + UISplitViewController в PortraitMode + UIActionSheet в MasterController = Ошибка подтверждения - PullRequest
7 голосов
/ 16 марта 2012

У меня есть приложение, основанное на 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 ]

4 голосов
/ 14 июня 2012

Исходя из вышеизложенного и с огромным уважением к инженеру 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];
    }
2 голосов
/ 19 марта 2012

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

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

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

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

1 голос
/ 02 июня 2012

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

0 голосов
/ 24 апреля 2012

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

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

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

0 голосов
/ 04 апреля 2012

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

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

...