Приложение вылетает на [UIAlertView show] - PullRequest
3 голосов
/ 20 мая 2011

Мое приложение падает, как только я хочу показать предупреждение. Этот код довольно простой, и я не могу найти ничего плохого в этом. Может кто-нибудь проверить, что я делаю что-то не так?

@implementation SampleClass
- (void) showAlert
{
UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"Make an informed choice"
                      message:@"Descriptive text"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"OK", nil];
[alert show];
[alert release];    
}
@end

стек:

0   libobjc.A.dylib                 0x3006bc98 objc_msgSend + 16
1   NESampleApp                     0x002ec5bc 0x1000 + 3061180
2   UIKit                           0x35584bee -[UIWindow _sendTouchesForEvent:] + 362
3   UIKit                           0x35584568 -[UIWindow sendEvent:] + 256
4   UIKit                           0x3556d30c -[UIApplication sendEvent:] + 292
5   UIKit                           0x3556cc4c _UIApplicationHandleEvent + 5084
6   GraphicsServices                0x35350e70 PurpleEventCallback + 660
7   CoreFoundation                  0x3599da90 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
8   CoreFoundation                  0x3599f838 __CFRunLoopDoSource1 + 160
9   CoreFoundation                  0x359a0606 __CFRunLoopRun + 514
10  CoreFoundation                  0x35930ebc CFRunLoopRunSpecific + 224
11  CoreFoundation                  0x35930dc4 CFRunLoopRunInMode + 52
12  GraphicsServices                0x35350418 GSEventRunModal + 108
13  GraphicsServices                0x353504c4 GSEventRun + 56
14  UIKit                           0x35597d62 -[UIApplication _run] + 398
15  UIKit                           0x35595800 UIApplicationMain + 664
16  NESampleApp                     0x0017d10c 0x1000 + 1556748
17  NESampleApp                     0x007d3720 0x1000 + 8202016

Обновление: после установки делегата на nil, я получаю дополнительную информацию вместе с падением:

<Error>: -[CALayer isTransformGestureInput]: unrecognized selector sent to instance 0xb4c8a0
<Error>: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CALayer isTransformGestureInput]: unrecognized selector sent to instance 0xb4c8a0'

Ответы [ 4 ]

6 голосов
/ 20 января 2013

попробуйте это вместо [alert show]

[alert performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
2 голосов
/ 13 сентября 2012

Хотя этот ответ может не исправить этот конкретный (довольно старый) вопрос, я пришел сюда, потому что у меня были те же симптомы. Ответом на мою проблему было то, что я не передавал "nil" как второй элемент в otherButtonTitles: @ "OK".

Плохо:

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"Make an informed choice"
                      message:@"Descriptive text"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"OK"];

Хорошо:

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"Make an informed choice"
                      message:@"Descriptive text"
                      delegate:self
                      cancelButtonTitle:@"Cancel"
                      otherButtonTitles:@"OK", nil];

Что было интересно, так это то, что это сломало только мое устройство, а не симулятор iOS.

0 голосов
/ 06 июля 2013

Может быть, вы вызываете этот метод внутри блока? Это приведет к его падению. Попробуйте это из своего блока:

[self performSelectorOnMainThread:@selector(showAlert) 
withObject:nil waitUntilDone:YES];

Была такая же проблема. Это решило это. Ответ принят из: Как отобразить UIAlertView из блока на iOS?

0 голосов
/ 13 сентября 2012

Ваш аргумент otherButtonTitles должен заканчиваться нулем.

Как правило, методы, которые принимают переменное число аргументов, должны иметь nil в конце. Например:

[NSArray arrayWithObjects:objA, objB, nil];

а в вашем случае:

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"otherbutton", nil];
...