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

У меня есть приложение, основанное на UISplitViewController, которое показывает ActionSheet в MasterViewController разделения. До 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...

Идеи?

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

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


person Omer    schedule 15.03.2012    source источник
comment
Ну что за утверждение? Дайте нам сообщение из консоли.   -  person Jonathan Grynspan    schedule 16.03.2012
comment
Я отредактировал вопросы с точным утверждением.. спасибо   -  person Omer    schedule 16.03.2012
comment
После этого нам нужны следующие десять или около того строк в консоли.   -  person Jonathan Grynspan    schedule 16.03.2012
comment
сделано!... но я не думаю, что эти строки полезны =D   -  person Omer    schedule 16.03.2012
comment
А теперь обратная связь, пожалуйста...   -  person Jonathan Grynspan    schedule 16.03.2012
comment
Извините, Джонатан, я не уверен, что вы имеете в виду под «обратной трассировкой», но в консоли перед этими строками ничего нет. На самом деле нет никакого дополнительного кода, который может вызвать этот сбой. Кстати, спасибо, чувак, я очень ценю твое время.   -  person Omer    schedule 17.03.2012
comment
В GDB/LLDB введите bt, чтобы отобразить обратную трассировку (которая показывает серию вызовов функций, которые привели к ошибке утверждения).   -  person Jonathan Grynspan    schedule 17.03.2012
comment
У меня тоже такая же проблема. Вот обратная трассировка, которую я получаю: (gdb) bt #0 0x313d023c в objc_exception_throw () #1 0x35a57788 в +[NSException поднять:формат:аргументы:] () #2 0x35a57788 в +[NSException поднять:формат:аргументы:] () #3 0x3480c3a2 in -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] () #4 0x308a0492 in -[UIActionSheet(Private) presentSheetInPopoverView:] () #5 0x3068ed92 in -[UIActionSheet showInView:] () #6 0x00062d7a в ?? ()   -  person Tap Forms    schedule 19.03.2012
comment
Та же проблема здесь. Вы нашли какое-нибудь решение? Спасибо.   -  person Alexandre OS    schedule 19.03.2012
comment
FWIW, похоже, это исправлено в iOS 5.1.1.   -  person omz    schedule 20.05.2012


Ответы (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];
    }
person Paul Whitby    schedule 13.06.2012
comment
Если это не пользовательская кнопка, вам нужно вычислить из размера navigationController.view расположение прямоугольника, поскольку customView нет. - person Conor; 11.03.2014

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

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

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

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

person Tap Forms    schedule 19.03.2012
comment
проверьте мой ответ и прокомментируйте свое мнение - person Omer; 25.04.2012

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

person xiang    schedule 02.06.2012

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

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

person TChadwick    schedule 03.04.2012
comment
проверьте мой ответ и прокомментируйте свое мнение - person Omer; 25.04.2012

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

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

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

person Omer    schedule 24.04.2012