UIActionSheet аварийно завершает работу на iPad, а не на iPhone

Когда я смотрю в консоль, я получаю это сообщение

2010-09-18 17:04:05.284 Wasted Time[8998:207] *** Assertion failure in -[UIActionSheet showInView:], /SourceCache/UIKit_Sim/UIKit-1145.66/UIAlert.m:7073
2010-09-18 17:04:05.286 Wasted Time[8998:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: view != nil'
2010-09-18 17:04:05.286 Wasted Time[8998:207] Stack: (
    42272848,
    43430700,
    42010379,
    811796,
    3796273,
    3862560,
    9631,
    3616645,
    3688229,
    3682846,
    3690662,
    3686119,
    4983946,
    71264534,
    71263781,
    71207378,
    71206706,
    3003734,
    3030334,
    3011831,
    3043800,
    51265916,
    41552028,
    41547944,
    3002913,
    3036018,
    8314
)
terminate called after throwing an instance of 'NSException'

Код выглядит следующим образом:

- (void)viewDidLoad {
    BOOL    continueYesNo;
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    continueYesNo = [prefs boolForKey:@"keyContinueMeeting"];   
    if (continueYesNo) {
        NSString *message_continue = [[NSString alloc] initWithFormat:@"Do you want to Continue the Prior Meeting"];
        UIActionSheet *actionSheet = [[UIActionSheet alloc] 
            initWithTitle:message_continue 
            delegate:self
            cancelButtonTitle:@"Reset" 
            destructiveButtonTitle:@"Continue"
            otherButtonTitles:nil];
        [actionSheet showInView:self.view];
        [actionSheet release];
        [message_continue release];
    }
}

Он отлично работает как на iPhone, так и в симуляторе iPhone, но вылетает в симуляторе iPad.


person Michael Rowe    schedule 18.09.2010    source источник


Ответы (6)


В сообщении об ошибке говорится:

Недействительный параметр не удовлетворяет: view! = Nil

Скорее всего из этой строки:

[actionSheet showInView:self.view];

Поскольку вы говорите, что это работает на iPhone, но не на iPad, это означает, что кодовый путь, который использует iPad, чтобы добраться до этой строки, вероятно, отличается от кодового пути, который использует iPhone, чтобы добраться до этой строки. Это означает, что свойство view контроллера представления, вероятно, не установлено для iPad.

Мое предположение: вы забыли подключить выход view в Interface Builder для версии xib для iPad, которую использует этот контроллер представления.

person Shaggy Frog    schedule 18.09.2010
comment
Спасибо за быстрый ответ. В этом есть смысл, но у меня нет отдельного файла NIB для версии для iPad. В предыдущей версии приложения я использовал команду ›Проект, Обновить текущую цель для iPad. - person Michael Rowe; 19.09.2010
comment
Что ж, в вашем сообщении об ошибке говорится, что утверждение поднято с [UIActionSheet showInView:], потому что self.view равно nil. Почему это nil? Начните с этого и продвигайтесь вверх. - person Shaggy Frog; 19.09.2010
comment
Спасибо! Я создал новые XIB для каждого из 3 TabView в моем контроллере TabView .. позволяет мне создать гораздо лучший интерфейс для iPad .. ваш вопрос направил меня в правильном направлении ... однако, когда я создал новые XIB для версий iPad и подключил их к mainwindow-ipad.xib (TabViewController), теперь я получаю новую / другую ошибку времени выполнения, отправляю новый вопрос для этого. - person Michael Rowe; 19.09.2010
comment
Хорошо, теперь у меня это работает ... неправильно подключено. И я снова возвращаюсь к ошибке showInView выше. Это может быть вопрос для новичков, как мне вернуться наверх? Я прошел через отладчик и не уверен, как узнать, на что указывает self.view. - person Michael Rowe; 19.09.2010
comment
Добавьте строку типа UIView* v = self.view; и установите точку останова. v равно nil? - person Shaggy Frog; 19.09.2010
comment
Спасибо .. Строка после UIView * v = self.view - это та, которая вылетит. В отладчике v имеет значение 0x296364f, которое выглядит как указатель памяти. У UIResponder также есть действующий указатель - когда я смотрю на детали в окне выражения. Возможно, мне нужно получить родительское представление? Но это не имеет смысла ... Self - это класс, в котором я нахожусь, представление, которое только что выполнило viewDidLoad, поэтому не следует ли самому возвращать это представление? - person Michael Rowe; 19.09.2010
comment
Хорошо .. Я понял это - [actionSheet showInView: self.parentViewController.view]; - person Michael Rowe; 19.09.2010

У меня тоже была эта проблема, но я использовал [actionSheet showInView:[self.view window]]; (чтобы исправить другую ошибку, когда можно было выбрать только половину кнопки отмены).

Теперь я условно меняю это на [actionSheet showInView:self.view]; на iPad.

Я обнаружил, что лучше не использовать стиль UIActionSheetStyleBlackTranslucent и на iPad - у iPad есть собственный стиль, и его установка, похоже, добавляет кнопку отмены (которая по умолчанию на iPad не отображается).

person William Denniss    schedule 10.11.2010
comment
Хорошо ... попробую, я обнаружил, что в последней сборке мой трюк .parentViewController не работает ... Приложение просто вылетает каждый раз ... - person Michael Rowe; 11.07.2011
comment
NB: использование окна приведет к тому, что iPhone в альбомной ориентации будет неправильно отображать лист действий. - person amleszk; 23.02.2013

сделать вот так:

[self performSelectorOnMainThread:@selector(choosePhoto) withObject:nil waitUntilDone:NO];

-(void)choosePhoto
{

    UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:@""
                                                  delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil
                                         otherButtonTitles:@"Take Photo", @"Choose from gallery", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
    actionSheet.tag = 1;
    [actionSheet showInView:self.view];
    [actionSheet release];
}

Работал на меня

person Saurabh Verma    schedule 27.09.2010
comment
Спасибо .. Мне удалось решить, используя родительский указатель. Отметим это для будущих проверок. - person Michael Rowe; 28.09.2010
comment
ну .. похоже, это не сработало с ловушками приложения xCode ... в последней версии с обоими вышеупомянутыми решениями [actionSheet showInView: self.parentViewController.view]; и оба решения перечислены ... Вернуться к чертежной доске ... - person Michael Rowe; 11.07.2011

Думаю, проблема в том, что просмотр еще не появился. Поместите его в viewDidAppear: и он должен работать нормально.

person Scott Gardner    schedule 27.01.2012

Для таких, как я, которые могут использовать UIActionSheet несколько иначе, чем в исходном вопросе, но все еще не работают на iPad, я использовал:

[actionSheet showFromRect:m_view.bounds inView:m_view animated:YES];
[actionSheet release];

... который работает на iPhone, но не работает на iPad.

Этот пример работает в моем конкретном приложении на обоих устройствах:

[actionSheet showInView:m_view];
[actionSheet release];

С уважением, Дэвид

person David Manpearl    schedule 30.08.2012

Это старый вопрос, но сегодня я столкнулся с той же проблемой. У меня есть файл xib для UIViewController, который является общим для iPhone и iPad, а метод showInView на UIActionSheet вызывал сбой приложения iPad.

Оказалось, позвонил showInView в viewDidAppear вместо viewDidLoad исправил для меня. Возможно, к моменту вызова viewDidLoad на iPad все подключения к IB не были установлены.

(мой UIViewController был помещен в UINavigationController, поэтому мне интересно, не является ли увеличенное время анимации причиной всей проблемы_

person Vinod Vishwanath    schedule 06.08.2013