Сбой UIActionSheet на iPad / не на iPhone - PullRequest
2 голосов
/ 19 сентября 2010

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

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.

Ответы [ 6 ]

5 голосов
/ 19 сентября 2010

Сообщение об ошибке гласит:

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

Вероятно из этой строки:

[actionSheet showInView:self.view];

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

Мое предположение: вы забыли подключить розетку view в Интерфейсном Разработчике для iPad-версии xib, которую использует этот контроллер представления.

3 голосов
/ 10 ноября 2010

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

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

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

0 голосов
/ 07 августа 2013

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

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

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

0 голосов
/ 30 августа 2012

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

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

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

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

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

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

0 голосов
/ 27 января 2012

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

0 голосов
/ 27 сентября 2010

делай так:

[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];
}

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

...