【问题标题】:-[UIViewController _keyboard]: unrecognized selector sent to instance 0x7b731ac0-[UIViewController _keyboard]:无法识别的选择器发送到实例 0x7b731ac0
【发布时间】:2015-01-13 20:17:33
【问题描述】:

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

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

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

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

[编辑 - 删除代码,我在一个新项目中测试了代码,它运行良好]

[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

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

【问题讨论】:

  • 您是否尝试过在您的构建方案中打开僵尸以查看它是否指向特定对象?
  • 是的,僵尸已经开启,似乎没有什么不同。当应用程序崩溃时,发送 _keyboard 选择器的实例仍在内存中,我似乎也没有找到任何其他僵尸对象。

标签: ios objective-c uiviewcontroller uikeyboard


【解决方案1】:

我假设这段代码在 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 重命名为 myInputViewController 之类的其他名称。

【讨论】:

  • 太棒了,我感激不尽。有趣的是,在查看我的堆栈跟踪试图找出 _keyboard 选择器是什么时,我找到了 UIInputViewController,我知道使用苹果定义的名称是一个坏主意,但它甚至没有点击我把我的容器命名为那个。这确实是我用头敲键盘的一个星期。
  • 这也解释了为什么 iPhone 应用程序不会崩溃,我没有为 iPhone 使用那个特定的容器。
【解决方案2】:

问题出在您的 iPad 故事板中。检查所有视图控制器的连接。您可能在情节提要中有一个未使用的连接,请删除它们。如果它适用于 iPhone 而不是 iPad,它就必须在那里。到处放置断点以查看崩溃前的最后位置。

【讨论】:

  • 我在我的故事板中找不到任何东西,所以我删除了它并创建了一个新的,但仍然出现错误。我为我的故事板添加了 xml,看看我是否只是没有看到重要的东西。我的代码中唯一的 IBoutlet 是 adView,它是我故事板中的 containerView。如果您需要更多说明,请告诉我。
  • 在您的项目设置中的常规 - 部署信息下,检查您的主界面。或者尝试运行一个全新的 iPad 故事板。如果在更新 Xcode 后出现此错误,请尝试更改部署目标。
猜你喜欢
  • 2014-01-13
  • 2012-08-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多