Objective c 关于发送到实例的无法识别的选择器的混淆

Objective c 关于发送到实例的无法识别的选择器的混淆,objective-c,uisegmentedcontrol,unrecognized-selector,Objective C,Uisegmentedcontrol,Unrecognized Selector,所以,我一直收到这个错误: 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[CardGameViewController matchModeSegmentedControl:]:发送到实例0x8c84da0的选择器无法识别” 我一直在谷歌上搜索,但我很困惑到底是什么问题。下面是所有包含任何涉及分段控件的代码(我当前所有麻烦的根源) 如果你需要更多的信息,请告诉我。谢谢 编辑: 下面是完整的堆栈跟踪…很抱歉格式化。我只是复制和粘贴 201

所以,我一直收到这个错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[CardGameViewController matchModeSegmentedControl:]:发送到实例0x8c84da0的选择器无法识别”

我一直在谷歌上搜索,但我很困惑到底是什么问题。下面是所有包含任何涉及分段控件的代码(我当前所有麻烦的根源)

如果你需要更多的信息,请告诉我。谢谢

编辑: 下面是完整的堆栈跟踪…很抱歉格式化。我只是复制和粘贴

 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)
通过一个All Exceptions断点,XCode将我引导到以下位置:

#import "CardGameAppDelegate.h"

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

错误是有东西将消息
-matchModeSegmentedControl:
发送到
CardGameViewController
的实例。请注意该邮件名称上的冒号

您的类有一个属性
matchModeSegmentedControl
,其getter是以该属性命名的方法(
-matchModeSegmentedControl
)。注意,该方法名称中没有冒号

您的类还有一个名为
-matchModeSegmentedControlIndexChanged:
的操作方法。与操作方法一样,该方法接受一个参数,因此有一个冒号。此外,名称与属性非常相似


我怀疑您将分段控件的操作连接到了错误的操作方法(实际上不存在的方法)。当它应该调用名为
-matchModeSegmentedControlInExchange:
的操作时,它正在尝试调用名为
-matchModeSegmentedControlInExchange:
的操作。这可能是在NIB中设置的。可能您在某个时候更改了操作方法的名称,但没有更新NIB中的连接。NIB应该向您显示一条警告,我希望在您构建时也会显示该警告。

尝试添加所有异常断点并检查调用堆栈。在调用此方法的位置发布代码。matchModeSegmentedControlIndexChanged@OlegShulakov:原始帖子中包含的调用堆栈。@Dev该方法在运行时通过插座或其他方式触摸UISegmentedControl时被调用(对不起,我对iOS非常陌生,我还没有完全掌握所有术语!)。这意味着CardGameViewController没有名为
matchModeSegmentedControl:
的方法。通常发生此错误是因为您在某个地方使用了错误的指针类型。XCode不会给我任何警告,但看起来您好像发现了什么!我将分段控件的出口重新分配给
-matchModeSegmentedControlIndexChanged:
方法,错误神奇地消失了。然而,(承认这是一个全新的问题…)现在
-touchCardButton:
方法无法禁用分段控件。(当然,应用程序崩溃时也会出现这种情况……)你知道我的代码哪里出错了吗?谢谢出口是一个属性,它保存对NIB中对象的引用,并连接到NIB中的该对象。这不同于将控件的“已发送操作”连接连接到其目标。通常,您可能有一个从控制器对象到分段控件的出口,和/或将分段控件配置为将其操作发送到目标,但您没有“出口”从分段控制器。我希望您希望将控制器的
matchModeSegmentedControl
出口连接到分段控件,并将分段控件的操作连接到目标上的
matchModeSegmentedControlIndexChanged:
操作方法。您完全正确!这就是我真正想说的。(我还没有完全掌握术语。但这是一个很好的解释/澄清!)如果
-touchCardButton:
仍然没有更新分段控件,则表明您尚未将控制器的
匹配模式分段控件
出口连接到分段控件。
- (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];
}
 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)
#import "CardGameAppDelegate.h"

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