2015-04-16 2 views
2

Я работаю над старым iOS-приложением, первоначально написанным для iOS 6, и у него были некоторые таблицы UIAction, которые нужно было изменить, поэтому я работал над их переносом на UIAlertControllers , используя UIAlertActions. Это отлично работает на симуляторе iPad2, однако при тестировании на iPad Air (единственный iPad, к которому у меня есть доступ) мой UIAlertAction, а UIAlertController становится нулевым сразу после его создания (просматривается в отладчике, он получает указатель на создание , однако, как только он выполняет следующую строку, он становится нулевым). Вот пример кода:Почему мои UIAlertActions становятся nil на iPad Air

//When hovering over the next line, alert has a pointer 
UIAlertController* alert = [UIAlertController 
          alertControllerWithTitle:@"info" 
          message:@"testmessage" 
          preferredStyle:UIAlertControllerStyleActionSheet]; 
//alert pointer is now nil 
//test pointer shows up 
UIAlertAction* test= [UIAlertAction 
         actionWithTitle:@"I'm a Button" 
         style:UIAlertActionStyleDefault 
         handler:^(UIAlertAction * action){ 
          [alert dismissViewControllerAnimated: YES completion:nil]; 
         } 
         ]; 
//test pointer is nil, test2 pointer exists 
UIAlertAction* test2 = [UIAlertAction 
         actionWithTitle:@"I'm a Button" 
         style:UIAlertActionStyleDefault 
         handler:^(UIAlertAction * action){ 
          [alert dismissViewControllerAnimated: YES completion:nil]; 
         } 
         ]; 
//test2 pointer is nil 
[alert addAction:test]; 
[self presentViewController:alert animated:YES completion:nil]; //app crashes, because I'm trying to present a nil modal. 

Любые мысли или помощь будут очень восприимчивы!

+0

У меня была аналогичная проблема, и я решил ее, установив объект как '@property (strong, nonatomic)' вместо этого как локальную переменную. – rob180

+0

Какая ОС работает на вашем iPad? –

+0

@ rob180 Сделал это, но у меня все еще есть одна и та же проблема, по какой-то причине указатели на эти объекты пользовательского интерфейса становятся нулями непосредственно после их создания. – Jet

ответ

2

UIAlertController предназначен для iOS8 вверх. Используйте UIAlertView и UIActionSheet для до iOS8

Вы лучше проверить погоду устройство реагирует на класс,

if ([UIAlertController class]) { 
    // use UIAlertController for the action sheets as you have already posted 

// For all operating systems (like iOS8 upwards) will land in here. 

} else { 
    // use UIActionSheet - like you already used for iOS6 

} 

Это не разумно, чтобы проверить операционную систему номер развертывания, например, если 8.0 и т.д., проверяя если он отвечает классу, это правильный способ сделать это.

Это предотвращает крах означает, что вы не полагаетесь на номера с плавающей точкой, которые не гарантируются надежностью, как если бы они изменили способ названий операционных систем в будущем, ваш код сработает.

+0

Awesome, отлично работает! Большое спасибо! – Jet

+0

Не беспокойтесь. Спасибо, что приняли ответ –

Смежные вопросы