Действительно странное поведение UIButton. Сбои и дает несколько ошибок - PullRequest
2 голосов
/ 28 января 2012

У меня сейчас серьезные проблемы с моим приложением. Итак, есть две кнопки "зарегистрироваться". Верхний - «зарегистрироваться», а нижний - «войти». Поэтому, если я заполню все поля и нажму кнопку «зарегистрироваться» (верхнюю), то это приведет меня к наиболее правильному виду на моем изображении раскадровки (посмотрите на предоставленное изображение), который будет вызываться:

ConfirmationScreenController *csc = [self.storyboard instantiateViewControllerWithIdentifier:@"Confirmation Screen"];
[self.view addSubview:csc.view];

и это прекрасно работает. Появляется вид, но если я нажимаю кнопку «Войти» внизу, приложение вылетает. Кнопка вызывает этот метод:

-(IBAction)logIn:(id)sender {
    NSLog(@"hello");}

Думаю, все правильно подключил. Странная часть: когда я сбрасываю содержимое и настройки и запускаю его снова, он будет записывать «привет» один или два раза, но когда я нажимаю его еще раз, он снова падает с (gdb). Или однажды он сказал, что я вызвал метод на __NSCFTimer, хотя я никогда не настраивал таймер и даже не отправлял что-либо на таймер ... Что за черт?

Все кнопки на MainViewController работают нормально.

Кстати, при сборке или во время выполнения предупреждений нет.

Это обратный след:

#0  0x0183709b in objc_msgSend ()
#1  0x00024570 in -[UIApplication sendAction:to:from:forEvent:] ()
#2  0x0002455a in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#3  0x000c9b76 in -[UIControl sendAction:to:forEvent:] ()
#4  0x000ca03f in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#5  0x000c92fe in -[UIControl touchesEnded:withEvent:] ()
#6  0x00049a30 in -[UIWindow _sendTouchesForEvent:] ()
#7  0x00049c56 in -[UIWindow sendEvent:] ()
#8  0x00030384 in -[UIApplication sendEvent:] ()
#9  0x00023aa9 in _UIApplicationHandleEvent ()
#10 0x0157dfa9 in PurpleEventCallback ()
#11 0x016671c5 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#12 0x015cc022 in __CFRunLoopDoSource1 ()
#13 0x015ca90a in __CFRunLoopRun ()
#14 0x015c9db4 in CFRunLoopRunSpecific ()
#15 0x015c9ccb in CFRunLoopRunInMode ()
#16 0x0157c879 in GSEventRunModal ()
#17 0x0157c93e in GSEventRun ()
#18 0x00021a9b in UIApplicationMain ()
#19 0x000026f8 in main (argc=1, argv=0xbffff65c) at /Users/Martin/Desktop/MyApplication/MyApplication/main.m:16
Current language:  auto; currently objective-c

Storyboard

Ответы [ 4 ]

1 голос
/ 26 сентября 2012

У меня была такая же проблема, и это было потому, что у меня не было четкой ссылки на создаваемый и представляемый контроллер - который затем вызывался IBAction.

По сути, контроллерсоздается и отображается, но после этого ни у кого нет ссылки на него, поэтому его счетчик обращений обнуляется и ему не хватает памяти.Таким образом, вызов действия приведет к EXC_BAD_ACCESS.

0 голосов
/ 18 февраля 2013

Вам необходимо добавить ConfirmationScreenController в качестве свойства в вашем заголовочном файле. Я была такая же проблема. Но добавление контроллера subview в качестве свойства в заголовочный файл предотвратит сбой.

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

ПОПРОБУЙТЕ ЭТО ПЕРВЫЙ - В вашем коде для представления экрана подтверждения вы просто добавили его представление в текущий viewcontroller вместо того, чтобы фактически представлять его модально. Измените свой предыдущий код следующим образом:

Изменение

[self.view addSubview:csc.view];

до

[self presentModalViewController:csc animated:YES];

Таким образом, новый viewcontroller будет отвечать за полученные действия и правильно обрабатывать их. Если это не работает, следуйте еще нескольким предложениям:

Следует попробовать переименовать метод IBAction, затем отключить его в раскадровке и снова подключить. Также убедитесь, что определение метода в вашем файле .h равно точно так же, как метод в вашем файле .m. Например,

- (IBAction)logIn:(id)sender;

не совпадает с

- (IBAction)logIn;

Если у вас есть часть (id)sender в одной, убедитесь, что она есть и в другой.

Если бы все это не сработало, я бы откинулся назад и задохнулся. Перейдите к раскадровке, отсоедините все крючки и подключите их: IBOutlet с и IBAction с.

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

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

Один из способов убедиться, что вы можете получить представление о том, где происходит исключение, - это вставитьточка останова для ВСЕХ исключений и THROW Это остановит там, где возникла проблема, и там, где возникло исключение.

enter image description here

Это может помочь в отслеживании места возникновения проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...