0

Sooooo, я получаю эту ошибку:Путаница непризнанного селектор послал к экземпляру

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CardGameViewController matchModeSegmentedControl:]: unrecognized selector sent to instance 0x8c84da0'

Я делал кучу Googling, но я очень путать о том, что именно эта проблема. Вот весь код, содержащий все, что связано с Segmented Control (источник всех моих текущих проблем).

@interface CardGameViewController() 
... 
@property (nonatomic, weak) IBOutlet UISegmentedControl *matchModeSegmentedControl; 
... 
@end 

@implementation CardGameViewController 

...

- (CardMatchingGame *)game 
{ 
    self.matchModeSegmentedControl.enabled = YES; 
    if (!_game) { 
     _game = [[CardMatchingGame alloc] 
       initWithCardCount:[self.cardButtons count] 
       withDeck:[self newPlayingCardDeck] 
       withSegmentedControllerValue:self.gameMatchMode]; 
    } 
    return _game; 
} 

...

- (IBAction)touchCardButton:(UIButton *)sender 
{ 
    self.matchModeSegmentedControl.enabled = NO; 
    int cardIndex = [self.cardButtons indexOfObject:sender]; 
    Card *card = [self.game cardAtIndex:cardIndex]; 

    if (!card.isChosen) { 
     [self.game chooseCardAtIndex:cardIndex]; 

     [self updateUI]; 
     [self.game compareSelectedCards:cardIndex]; 
     [self performSelector:@selector(updateUI) 
        withObject:nil afterDelay:2.0]; 
    } 
} 

...

- (IBAction)matchModeSegmentedControlIndexChanged:(UISegmentedControl *)sender 
{ 
    self.gameMatchMode = sender.selectedSegmentIndex; 
    [self.game setValueMatchMode:self.gameMatchMode]; 
} 

Позвольте мне знать, если вам нужна дополнительная информация. Благодаря!

EDIT: Полная трассировка стека ниже ... извините за форматирование. Я просто скопировал и вставил.

2014-12-02 23:54:44.549 Matchismo[15252:60b] -[CardGameViewController 
matchModeSegmentedControl:]: unrecognized selector sent to instance 
0x8c454f0 (lldb) bt 
* thread #1: tid = 0x1a48c4, 0x015748b9 libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread', 
stop reason = breakpoint 1.1 
frame #0: 0x015748b9 libobjc.A.dylib`objc_exception_throw 
frame #1: 0x01892243 CoreFoundation`-[NSObject(NSObject) doesNotRecognizeSelector:] + 275 
frame #2: 0x017e550b CoreFoundation`___forwarding___ + 1019 
frame #3: 0x017e50ee CoreFoundation`__forwarding_prep_0___ + 14 
frame #4: 0x0158682b libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70 
frame #5: 0x002363b9 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 108 
frame #6: 0x00236345 UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61 
frame #7: 0x00337bd1 UIKit`-[UIControl sendAction:to:forEvent:] + 66 
frame #8: 0x00337fc6 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 577 
frame #9: 0x00337c06 UIKit`-[UIControl sendActionsForControlEvents:] + 48 
frame #10: 0x003a6222 UIKit`-[UISegmentedControl _setSelectedSegmentIndex:notify:animate:] + 598 
frame #11: 0x003a8573 UIKit`-[UISegmentedControl touchesEnded:withEvent:] + 175 
frame #12: 0x00275ddd UIKit`-[UIWindow _sendTouchesForEvent:] + 852 
frame #13: 0x002769d1 UIKit`-[UIWindow sendEvent:] + 1117 
frame #14: 0x002485f2 UIKit`-[UIApplication sendEvent:] + 242 
frame #15: 0x00232353 UIKit`_UIApplicationHandleEventQueue + 11455 
frame #16: 0x0177e77f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
frame #17: 0x0177e10b CoreFoundation`__CFRunLoopDoSources0 + 235 
frame #18: 0x0179b1ae CoreFoundation`__CFRunLoopRun + 910 
frame #19: 0x0179a9d3 CoreFoundation`CFRunLoopRunSpecific + 467 
frame #20: 0x0179a7eb CoreFoundation`CFRunLoopRunInMode + 123 
frame #21: 0x037e95ee GraphicsServices`GSEventRunModal + 192 
frame #22: 0x037e942b GraphicsServices`GSEventRun + 104 
frame #23: 0x00234f9b UIKit`UIApplicationMain + 1225 
frame #24: 0x00003edd Matchismo`main(argc=1, argv=0xbfffede4) + 141 at main.m:16 (lldb) 

С Все исключения точки останова, XCode направляет меня к этому:

#import "CardGameAppDelegate.h" 

int main(int argc, char * argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([CardGameAppDelegate class])); 
    } 
} 
+0

Попробуйте добавить точку останова всех исключений и проверить стек вызовов. –

+0

введите код, из которого вы вызываете этот метод. matchModeSegmentedControlIndexChanged – Dev

+0

@OlegShulakov: стек вызовов включен в исходное сообщение. – theRenaissanceMan

ответ

0

ошибка говорит, что что-то послал сообщение -matchModeSegmentedControl: к экземпляру CardGameViewController. Обратите внимание на двоеточие имени этого сообщения.

Ваш класс имеет свойство matchModeSegmentedControl, чей геттер - это метод, названный в честь объекта (-matchModeSegmentedControl). Обратите внимание: в этом имени метода нет двоеточия.

У вашего класса также есть метод действий с именем -matchModeSegmentedControlIndexChanged:. Как обычно для методов действия, этот метод принимает аргумент и, следовательно, имеет двоеточие. Кроме того, имя довольно похоже на свойство.

Я подозреваю, что вы подключили действие сегментарного элемента управления к неправильному методу действия (который фактически не существует). Он пытается вызвать действие с именем -matchModeSegmentedControl:, когда он должен вызывать действие с именем -matchModeSegmentedControlIndexChanged:. Возможно, это было настроено в NIB. Возможно, вы изменили имя метода действия в какой-то момент, но не обновили соединение в NIB. NIB должен показывать вам предупреждение, которое, я ожидаю, также появится при создании.

+0

XCode не дает мне никаких предупреждений, но похоже, что вы на что-то! Я повторно назначил выход Segmented Control в метод '-matchSegmentedControlIndexChanged:', и магически ошибка исчезла. Однако (по общему признанию, это совершенно новый вопрос ...), теперь метод '-touchCardButton:' не может отключить Segmented Control. (Конечно, это, конечно, также случай, когда приложение просто рушилось ...) Любая идея, где мой код запутался? Благодаря! – theRenaissanceMan

+0

Вывод - это свойство, которое содержит ссылку на объект в NIB и которое связано с этим объектом в NIB. Это отличается от того, чтобы связать соединение отправленного действия с его целью. Как правило, у вас может быть выход из объекта контроллера в сегментированный элемент управления и/или сегментированный элемент управления будет настроен для отправки своего действия на цель, но у вас не будет «выхода» ** из сегментированного контроллера. –

+0

Я ожидаю, что вы захотите подключить выход 'matchModeSegmentedControl' контроллера к сегментированному элементу управления и к действию сегментарного элемента управления к методу действия matchModeSegmentedControlIndexChanged:. –