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.