– :无法识别的选择器发送到实例0x7b731ac0

我正在编写一个包含3个viewControllers的应用程序,其中包含一个MainViewController。 其中一个是通过故事板控制并显示广告。 另外两个viewControllers正在显示信息。 根据按下的菜单按钮和要呈现的viewController,应用程序确定要更改的viewController。

到目前为止,一切都运行良好,除非选择了任何 textField。 这会导致显示错误。 该实例是包含textField的viewController,也是错误中命名的UIViewController。 此外,实例不是零。 我在下面放了一个断点: textFieldShouldBeginEditing:

并且在崩溃发生之前调用此方法。 该应用程序是通用的,并且不会在iPhone版本上崩溃,它使用相同的设置,除了它只显示广告和另一个viewController。 如果您需要查看更多代码或有任何想法,请与我们联系。 我无法在任何地方找到选择器_keyboard ,也不知道该怎么做。

我尝试使用最少的代码创建一个新项目来显示错误,但新项目都可以正常工作,所以问题是没有太多viewControllers一次可见。 我也知道我的转换代码工作正常,因为它适用于新项目。 我编写的viewControllers也不是问题,因为完全相同的viewController用于应用程序的iPhone部分以及仅在新的iPad测试项目中,并且问题根本没有显示在它们上面。

[编辑 – 删除代码,我在新项目中测试了代码并且工作正常]

[edit2 – 添加代码和说明]

 @implementation FSMainiPadViewController - (void)viewDidLoad { [super viewDidLoad]; self.leftView = [[UIView alloc] init]; self.rightView = [[UIView alloc] init]; if (!self.testVC) { self.testVC = [[FSTestViewController alloc] initWithNibName:nil bundle:nil]; } self.inputViewController = self.testVC; self.resultsVC = [[FSResultsTableViewController alloc] initWithNibName:nil bundle:nil]; self.dataViewController = self.resultsVC; self.leftView.frame = CGRectMake(0, VIEWFRAMEOFFSET/2, self.view.frame.size.width/2 , self.view.frame.size.height - IPADBANNERHEIGHT - VIEWFRAMEOFFSET/2 - MENUHEIGHT); self.rightView.frame = CGRectMake((self.view.frame.size.width)/2, VIEWFRAMEOFFSET/2, self.view.frame.size.width/2, self.view.frame.size.height - IPADBANNERHEIGHT - VIEWFRAMEOFFSET/2 - MENUHEIGHT); [self addChildViewController:self.inputViewController]; [self addChildViewController:self.dataViewController]; [self.view addSubview:self.inputViewController.view]; [self.view addSubview:self.dataViewController.view]; [self.dataViewController didMoveToParentViewController:self]; [self.inputViewController didMoveToParentViewController:self]; } 

选择textField会导致同样的错误。 我已经在我的MainViewController中注释了其他所有内容,它仍然会导致这个问题,但如果我创建一个新项目,甚至包括我更复杂的代码和xib,我无法重新创建崩溃。

如果您想要更多代码,请告诉我们。

堆栈跟踪

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[FSSettingsViewController _keyboard]: unrecognized selector sent to instance 0x7da1dbf0' *** First throw call stack: ( 0 CoreFoundation 0x0326d946 __exceptionPreprocess + 182 1 libobjc.A.dylib 0x02ef6a97 objc_exception_throw + 44 2 CoreFoundation 0x032755c5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277 3 CoreFoundation 0x031be3e7 ___forwarding___ + 1047 4 CoreFoundation 0x031bdfae _CF_forwarding_prep_0 + 14 5 UIKit 0x01e46d91 -[UIInputViewSet keyboard] + 52 6 UIKit 0x01b0807c -[UIKeyboardImpl setOrientation] + 94 7 UIKit 0x01b082c8 -[UIKeyboardImpl setFrame:] + 197 8 UIKit 0x01939084 UIViewCommonInitWithFrame + 1072 9 UIKit 0x01938bea -[UIView initWithFrame:] + 124 10 UIKit 0x01b02b62 -[UIKeyboardImpl initWithFrame:] + 107 11 UIKit 0x01b01c58 +[UIKeyboardImpl sharedInstance] + 158 12 UIKit 0x01e3bf4f -[UIPeripheralHost(UIKitInternal) _reloadInputViewsForResponder:] + 962 13 UIKit 0x01a845a5 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 316 14 UIKit 0x01a838ec -[UIResponder becomeFirstResponder] + 562 15 UIKit 0x0194a1c0 -[UIView(Hierarchy) becomeFirstResponder] + 114 16 UIKit 0x02115477 -[UITextField becomeFirstResponder] + 51 17 UIKit 0x01d183ef -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 200 18 UIKit 0x01d1aa16 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) oneFingerTap:] + 2762 19 UIKit 0x01d0e287 _UIGestureRecognizerSendActions + 327 20 UIKit 0x01d0cb04 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 561 21 UIKit 0x01d0eb4d -[UIGestureRecognizer _delayedUpdateGesture] + 60 22 UIKit 0x01d124ca ___UIGestureRecognizerUpdate_block_invoke661 + 57 23 UIKit 0x01d1238d _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317 24 UIKit 0x01d06296 _UIGestureRecognizerUpdate + 3720 25 UIKit 0x0191f26b -[UIWindow _sendGesturesForEvent:] + 1356 26 UIKit 0x019200cf -[UIWindow sendEvent:] + 769 27 UIKit 0x018e5549 -[UIApplication sendEvent:] + 242 28 UIKit 0x018f537e _UIApplicationHandleEventFromQueueEvent + 20690 29 UIKit 0x018c9b19 _UIApplicationHandleEventQueue + 2206 30 CoreFoundation 0x031911df __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 31 CoreFoundation 0x03186ced __CFRunLoopDoSources0 + 253 32 CoreFoundation 0x03186248 __CFRunLoopRun + 952 33 CoreFoundation 0x03185bcb CFRunLoopRunSpecific + 443 34 CoreFoundation 0x031859fb CFRunLoopRunInMode + 123 35 GraphicsServices 0x0519f24f GSEventRunModal + 192 36 GraphicsServices 0x0519f08c GSEventRun + 104 37 UIKit 0x018cd8b6 UIApplicationMain + 1526 38 FoodStorage 0x000a795d main + 141 39 libdyld.dylib 0x04e14ac9 start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException 

这是谷歌机器第一次让我失望。 在我制作这个应用程序的所有问题中,这是我似乎无法找到其他任何人的唯一问题。

我将假设这个代码在iOS7设备上运行时可以完美运行,并且可能在iOS8设备上针对iOS7 SDK进行编译时。

您似乎不幸地将您的某个属性命名为Apple添加的属性:

 @interface UIResponder (UIResponderInputViewAdditions) // Called and presented when object becomes first responder. Goes up the responder chain. @property (nonatomic, readonly, retain) UIInputViewController *inputViewController NS_AVAILABLE_IOS(8_0); @end 

当用户点击你的文本字段时,UIKit将抓住你的视图控制器,认为它是一个UIInputViewController并发送私人消息_keyboard 。 您的视图控制器没有实现此方法,它会使应用程序崩溃。

您需要做的唯一事情是将您的属性从inputViewController重命名为inputViewController其他myInputViewController

问题出在你的iPad故事板上。 检查所有视图控制器的连接。 您可能在故事板中有一个无法使用的连接,删除它们。 它必须在那里,如果它适用于iPhone而不是iPad。 在任何地方放置断点以查看崩溃前的最后位置。