2012-06-14 3 views
2

Я пытаюсь отобразить представление после того, как пользователь соглашается на совместное использование мест. Вот код:[__NSCFNumber isEqualToString:]: непризнанный селектор, отправленный в экземпляр

-(void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if (status == kCLAuthorizationStatusDenied) { 
     NSLog(@"Denied"); 
    } 
    else if (status == kCLAuthorizationStatusAuthorized) { 
     NSLog(@"Accepted!"); 
     AlertViewController *aViewController = [[AlertViewController alloc] initWithNibName:@"AlertViewController" bundle:nil]; 
     aViewController.view.frame = CGRectMake(0, 0, 320, 460); 
     aViewController.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; 
     AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [appDelegate.window addSubview:[aViewController view]]; 
    } 
} 

Но я получаю *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xee6fc90' ошибку в строке aViewController.view.frame = ...

Я ставлю точки останова и проверить, что aViewController не 0x00000 после alloc заявления. Я не могу понять, в чем проблема. Предлагаем решения.

+0

Какая линия вызывает крушение приложения? – Morion

+0

'aViewController.view.frame = CGRectMake (0, 0, 320, 460);' – ddd

+0

Не похоже, что это может вызвать эту ошибку. Неужели это действительно сбой там, когда выходите? – paulmelnikow

ответ

3

Я подозреваю проблему в файле xib или в процедуре инициализации представления AlertViewController (т. Е. ViewDidLoad или loadView). Единственный способ, по которому я могу рассуждать о том, что строка, задающая фрейм, сбой - это то, что вы впервые получаете доступ к свойству view, а просмотры лениво загружаются.

Я подозреваю, что если вы заменили

aViewController.view.frame = CGRectMake(0, 0, 320, 460); 

с

UIView *aVCView = aViewController.view; 
aVCView.frame = CGRectMake(0, 0, 320, 460); 

, то вы бы увидели аварию на первой линии, а не второй.

Для дальнейшего отладки, я бы использовал перерывы в представлении AlertViewController viewDidLoad или аналогичном. И дважды проверьте все в xib.

+0

Да, вы правы , Я проверил и обнаружил, что приложение завершается всякий раз, когда я впервые получаю доступ к 'aViewController' – ddd

+1

. Хорошо, это прогресс. Это означает, что вы можете сузить свою охоту до кода инициализации в своем настраиваемом контроллере представлений. Вы можете отредактировать свой вопрос с помощью некоторого кода из методов просмотра-просмотра этого контроллера, в частности, для того, чтобы определить, как загружается представление (например, из раскадровки/xib, внутри loadView или иначе). –

+1

Я выяснил, что проблема была в 'viewDidLoad', я ее модифицировал, и теперь приложение больше не разбивается. – ddd

0

В ваших условных операторах, какой тип status? Вы можете использовать неправильный оператор или метод. Например, если status является int, bool или float, вы должны использовать ==. Если бы это была строка, вы использовали бы isEqualToString, и если бы это был общий объект, вы могли бы просто использовать isEqual:. Существуют также специализированные версии функции isEqual:, такие как isEqualToArray.

Надеюсь, это поможет!

+0

Спасибо за ваш ответ, но я не думаю, что prblem имеет «статус», потому что ошибка возникает в строке 'aViewController.view.frame = CGRectMake (0, 0, 320, 460);' – ddd

1

Ошибка, которую вы видите, означает, что вы или фреймворк пытаетесь получить длину NSNumber. Они не имеют длину

Чтобы сузить это вниз, вы должны использовать точки останова исключения:

  1. Переключение в навигаторе точек останова.
  2. Нажмите кнопку + в левом нижнем углу.
  3. Pick Добавить Exception Breakpoint ...
  4. Нажмите Done. (По умолчанию являются Исключение: Все и Перерыв:. На Throw именно то, что вы хотите.)

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

Некоторые возможности:

  1. Вы назначая NSNumber к NSString собственности, таких как TextView-х text. Кажется, что корректировка кадра в представлении - это то, что запускает его, но ошибка находится в другом коде.
  2. Вы используете ARC, и у вас есть объект в классе контейнера или какая-либо другая форма, которая является «слабой», но не обнуляет слабые. Он был удален и заменен NSNumber, но другой код пытается получить доступ к строке в этом месте за всю свою жизнь.
  3. У вас есть пользовательский вид подкласса, который обрабатывает NSNumber как строку.

Но это предположение бесполезно. Получить отладчик остановлен там, где возникает исключение; проблема, вероятно, станет очевидной.

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