PushViewController ломает мою программу в операторе if

Я уже создал контроллер навигации в другом классе с контроллером корневого представления (экран входа в систему). Когда я нажимаю кнопку входа в систему, я хочу, чтобы она нажималась на контроллер представления панели инструментов. Вот мой код

- (IBAction)logInHit:(id)sender {

    if (passWord == true) {
        DashBoardViewController *dash = [[DashBoardViewController alloc] initWithNibName:@"DashBoardViewController" bundle:nil];
        [self.navigationController pushViewController:dash animated:YES];
    }

    else if (passWord == false){
        UIAlertView *alert = [[UIAlertView alloc] init];
        [alert setTitle:@"Incorrect Password"];
        [alert setMessage:@""];
        [alert setDelegate:self];
        [alert addButtonWithTitle:@"Try Again"];
        [alert show];
    }
}

Он работает, когда он вызывает контроллер представления, а также работает, когда его нет в операторе if, но по какой-то странной причине он ломается при использовании кода выше. Предупреждение работает нормально! Это просто толчок! Пожалуйста помоги!

В приложении Delegate.h:

    NavigationViewController *navView;

Вот делегат приложения (это создает экземпляр созданного мной класса navigationController, основанного на общем):

    LogInViewController *logInView = [[LogInViewController alloc] init];
navView = [[NavigationViewController alloc] initWithRootViewController:logInView];


[self.window addSubview:navView.view];

Вот журнал:

2014-03-06 22:15:43.552 TopOPPS REP APP[795:70b] Application windows are expected to have a root view controller at the end of application launch
2014-03-06 22:16:18.728 TopOPPS REP APP[795:70b] -[LogInViewController textEnded:]: unrecognized selector sent to instance 0x109412a90
2014-03-06 22:16:18.730 TopOPPS REP APP[795:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[LogInViewController textEnded:]: unrecognized selector sent to instance 0x109412a90'
*** First throw call stack:
(

0   CoreFoundation                      0x0000000101890795 __exceptionPreprocess + 165

1   libobjc.A.dylib                     0x00000001015f3991 objc_exception_throw + 43

2   CoreFoundation                      0x0000000101921bad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205

3   CoreFoundation                      0x000000010188209d ___forwarding___ + 973

4   CoreFoundation                      0x0000000101881c48 _CF_forwarding_prep_0 + 120

5   UIKit                               0x00000001002570ae -[UIApplication sendAction:to:from:forEvent:] + 104

6   UIKit                               0x0000000100257044 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 17

7   UIKit                               0x000000010032b450 -[UIControl _sendActionsForEvents:withEvent:] + 203

8   UIKit                               0x000000010085a6d5 -[UITextField _resignFirstResponder] + 256

9   UIKit                               0x000000010037ee40 -[UIResponder resignFirstResponder] + 222

10  UIKit                               0x000000010085a4de -[UITextField resignFirstResponder] + 114

11  UIKit                               0x000000010029b888 -[UIView setUserInteractionEnabled:] + 285

12  UIKit                               0x000000010087f7b5 -[_UIViewControllerTransitionContext _disableInteractionForViews:] + 194

13  UIKit                               0x0000000100364ce5 -[UINavigationController pushViewController:transition:forceImmediate:] + 1038

14  TopOPPS REP APP                     0x000000010000254a -[LogInViewController logInHit:] + 202

15  UIKit                               0x0000000100257096 -[UIApplication sendAction:to:from:forEvent:] + 80

16  UIKit                               0x0000000100257044 -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 17

17  UIKit                               0x000000010032b450 -[UIControl _sendActionsForEvents:withEvent:] + 203

18  UIKit                               0x000000010032a9c0 -[UIControl touchesEnded:withEvent:] + 530

19  UIKit                               0x000000010028bc15 -[UIWindow _sendTouchesForEvent:] + 701

20  UIKit                               0x000000010028c633 -[UIWindow sendEvent:] + 988

21  UIKit                               0x0000000100265fa2 -[UIApplication sendEvent:] + 211


22  UIKit                               0x0000000100253d7f _UIApplicationHandleEventQueue + 9549

23  CoreFoundation                      0x000000010181fec1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17

24  CoreFoundation                      0x000000010181f792 __CFRunLoopDoSources0 + 242

25  CoreFoundation                      0x000000010183b61f __CFRunLoopRun + 767

26  CoreFoundation                      0x000000010183af33 CFRunLoopRunSpecific + 467

27  GraphicsServices                    0x00000001039983a0 GSEventRunModal + 161

28  UIKit                               0x0000000100256043 UIApplicationMain + 1010

29  TopOPPS REP APP                     0x0000000100001d53 main + 115

30  libdyld.dylib                       0x0000000101f1f5fd start + 1

31  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

person DSki867    schedule 07.03.2014    source источник
comment
вы используете xib или раскадровку   -  person Muralikrishna    schedule 07.03.2014
comment
Пожалуйста, помогите мне. не могли бы вы отладить свой код и сообщить нам? на каком месте ваш код ломается.   -  person    schedule 07.03.2014
comment
Вы хотите, чтобы я вставил консоль отладки?   -  person DSki867    schedule 07.03.2014
comment
используете ли вы Xib, если не DashBoardViewController *dash = [[DashBoardViewController alloc] init]; [self.navigationController pushViewController: анимация тире: YES];   -  person Charan Giri    schedule 07.03.2014
comment
Я использую xib для просмотра тире   -  person DSki867    schedule 07.03.2014
comment
И я просто пытаюсь создать экран входа в систему, поэтому, когда я нажимаю «Войти», он проверяет, чему равен текст в текстовом поле пароля, а затем либо выдает предупреждения, либо нажимает новый контроллер, а часть push — это то, что не работает   -  person DSki867    schedule 07.03.2014
comment
Я использую все файлы xib, без раскадровки   -  person DSki867    schedule 07.03.2014
comment
истинно ли условие if? попробуйте проверить с помощью точек останова.   -  person GoGreen    schedule 07.03.2014
comment
И да, в делегате приложения я делаю navController.   -  person DSki867    schedule 07.03.2014
comment
С помощью navController я создаю rootviewcontroller, и это экран входа в систему. Этот код находится в этом контроллере представления, чтобы перейти к следующему.   -  person DSki867    schedule 07.03.2014
comment
Если условие истинно, я проверил его с помощью распечатки в консоли.   -  person DSki867    schedule 07.03.2014
comment
не могли бы вы вставить журнал консоли?   -  person GoGreen    schedule 07.03.2014
comment
Я проверил с точками останова, и код попадает в строку вызова push и ломает их, поэтому он ломается при нажатии.   -  person DSki867    schedule 07.03.2014
comment
хорошо .. Я понял .. было бы полезно, если бы вы добавили журнал консоли   -  person GoGreen    schedule 07.03.2014
comment
Я только что добавил журнал консоли. Спасибо за помощь!   -  person DSki867    schedule 07.03.2014
comment
Похоже, что контроллер корневого представления не настроен должным образом. Не могли бы вы вставить код о том, как вы устанавливаете корневой ViewController   -  person GoGreen    schedule 07.03.2014
comment
Я только что опубликовал код rootview   -  person DSki867    schedule 07.03.2014
comment
Хорошо, вы неправильно настраиваете rootviewcontroller окна. У вас должно получиться так: self.window.rootViewController = navView; и удалите [self.window addSubview:navView.view];   -  person Rodrigo Ayala    schedule 07.03.2014
comment
К сожалению, то, что сказал Родриго, не помогло!   -  person DSki867    schedule 07.03.2014
comment
Пожалуйста, добавьте правильное объяснение, чтобы другой пользователь мог вам помочь, вы не предоставляете никакой информации о UItextfld, и журнал сбоев показывает это.   -  person    schedule 07.03.2014
comment
вы можете проверить это в методе делегата UITextField textFieldDidEndEditing. Вот ссылка на ответ стекового потока   -  person GoGreen    schedule 07.03.2014
comment
позвольте мне дать вам голову. в stackoverflow никогда не изменяйте существующий вопрос, чтобы задать другой вопрос!. Всегда рекомендуется публиковать это как отдельный вопрос.   -  person GoGreen    schedule 07.03.2014


Ответы (3)


Ладно, я понял!

В файле NIB «LogInViewController» вы создали действие с именем «textEnded», после чего удалили этот метод, но не ссылку из NIB.

Чтобы исправить это, перейдите в NIB LogInViewController, чтобы увидеть построитель интерфейсов, щелкните свои UITextFields и найдите в инспекторе подключений метод «textEnded» в категории «Отправленные события». После этого нажмите на значок «X», чтобы удалить ссылку.

См. это изображение в качестве ссылки:

введите здесь описание изображения

person Rodrigo Ayala    schedule 07.03.2014

1. Вы должны установить контроллер корневого представления в appDelegate, например,

 LogInViewController *loginVC = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];
 UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:loginVC];
 self.window.rootViewController = navController;

Я думаю, вы не знакомы с условием if.

Вы должны написать так

- (IBAction)logInHit:(id)sender {

    if (passWord ) {
        DashBoardViewController *dash = [[DashBoardViewController alloc] initWithNibName:@"DashBoardViewController" bundle:nil];
        [self.navigationController pushViewController:dash animated:YES];
    }
    else {
        UIAlertView *alert = [[UIAlertView alloc] init];
        [alert setTitle:@"Incorrect Password"];
        [alert setMessage:@""];
        [alert setDelegate:self];
        [alert addButtonWithTitle:@"Try Again"];
        [alert show];
    }
}
person Community    schedule 07.03.2014

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

 LogInViewController *loginVC = [[LogInViewController alloc] initWithNibName:@"LogInViewController" bundle:nil];

 UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:loginVC];

 self.window.rootViewController = navController;

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

вы создали один метод с именем -(IBAction)textEnd:(id)sender{} раньше и связали этот метод с кнопкой или textfied в любом месте, а теперь вы удалили этот метод и забыли удалить ссылку на этот метод из файловый инспектор...

просто дважды проверьте свою ссылку в файловом инспекторе, все ли методы доступны или нет...

я получил ту же ошибку, когда я создаю метод -(IBAction)textEnd:(id)sender{} и связываю его с UITextfield с действием EditingDidEnd из файлового инспектора, а затем удаляю весь метод из моего файла .m и я получил ту же ошибку при нажатии кнопки входа в систему, поэтому проверьте, все ли ваши ссылки имеют доступные связанные методы

person jayraj m.g.    schedule 07.03.2014
comment
Это не сработало для меня. Это я не туда поставил? - person DSki867; 07.03.2014
comment
я делаю ваш код (IBAction)logInHit:(id)sender {} на своей странице и проверяю, что код работает нормально..... - person jayraj m.g.; 07.03.2014
comment
установите мой код ответа в следующем методе: - (BOOL) приложение: (UIApplication *) приложение didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {......} - person jayraj m.g.; 07.03.2014
comment
Можете ли вы сказать мне, что вы вызывали свой метод logInHit программно или с помощью xib и связывали этот метод с кнопкой? - person jayraj m.g.; 07.03.2014
comment
Это все еще не сработало. Моя проблема в том, что страница входа загружается нормально, но затем, когда я ввожу пароль и нажимаю войти, она ломается - person DSki867; 07.03.2014
comment
Я связал метод с кнопкой - person DSki867; 07.03.2014
comment
у вас есть метод textEnd: в loginviewcontroller? - person jayraj m.g.; 07.03.2014
comment
- (IBAction)textChanged:(id)sender { if ([_passwordField.text isEqualToString:@password]) passWord = true; иначе пароль = ложь; } - person DSki867; 07.03.2014
comment
У меня есть метод textChanged, но у меня нет конечного метода. Как написать один из них? - person DSki867; 07.03.2014
comment
На самом деле этот метод даже не должен иметь значения, потому что он проходит проверку правильности пароля. Я проверил точки останова, и он переходит в оператор if, но затем прерывается только тогда, когда он хочет нажать новый контроллер представления. - person DSki867; 07.03.2014
comment
в вашем журнале консоли говорится, что [LogInViewController textEnded:]: нераспознанный селектор отправлен экземпляру 0x109412a90 ', поэтому я думаю, что вам нужно дважды проверить свои ссылки в файловом инспекторе и запрограммировать, чтобы все методы были доступны, и вы не вызывали какой-либо метод, который не существует... - person jayraj m.g.; 07.03.2014
comment
Что @jayrajm.g. сказал должно работать. вы должны написать код, упомянутый в этом ответе, в методе applicationDidFinishLaunchingWithOptions в файле appDelegate. - person GoGreen; 07.03.2014
comment
что связано с методом IBAction textChanged в xib? - person GoGreen; 07.03.2014
comment
Итак, я сделал все это, но он все еще ломается, когда пытается вставить туда второй контроллер представления. Я проверяю, изменяется ли текстовое значение, и если да, то я меняю логическое значение, и все это работает, потому что в противном случае он не попал бы в оператор if, но тогда, когда он нажимает, он ломается. - person DSki867; 07.03.2014
comment
Думаю проблема в файле xib. Возможно, вы связали два метода IBAction с textField, чтобы проверить изменение текста. Пожалуйста, проверьте, есть ли дополнительный метод с именем textEnd:, щелкнув правой кнопкой мыши текстовое поле, и если да, удалите его. - person GoGreen; 07.03.2014
comment
Текстовое поле кажется проблемой. Я сделал метод valueChanged на основе UITextField в xib - person DSki867; 07.03.2014
comment
просто сохраните ссылку на метод, который вы используете сейчас, и удалите все предыдущие ссылки на другие методы, которые вы удалили. - person GoGreen; 07.03.2014
comment
@ DSki867: Пожалуйста, добавьте правильное объяснение, чтобы другой пользователь мог вам помочь, вы не предоставляете никакой информации о UItextfld, и журнал сбоев показывает это. - person ; 07.03.2014
comment
Вот оно! это было проблемой! У меня было слишком много связей. Теперь моя проблема заключается в том, какой метод использовать? Редактирование закончилось? Как мне заставить текстовое поле проверить, есть ли в нем правильный ответ, а затем изменить логическое значение? - person DSki867; 07.03.2014
comment
@ DSki867: используйте метод «Редактирование измененного» для проверки пароля и не забудьте удалить другие ссылки, иначе снова получите ту же ошибку и проверьте мой отредактированный ответ .. - person jayraj m.g.; 07.03.2014
comment
вы можете проверить это в методе делегата UITextField textFieldDidEndEditing. Вот ссылка на ответ стекового потока - person GoGreen; 07.03.2014