输入 UISearchBar 会使我的应用程序崩溃

Posted

技术标签:

【中文标题】输入 UISearchBar 会使我的应用程序崩溃【英文标题】:Typing in UISearchBar crashes my app 【发布时间】:2015-02-03 17:20:55 【问题描述】:

更新 2

当用户点击 ViewController1 中的按钮后,我的应用程序在模态显示时崩溃。在我的故事板中,我有一个标准的present modally segue 设置来弹出包含UISearchBar 的 UINavController/UITableViewController。每次都失败。

但是,在我的AppDelegate 中,如果我将窗口的rootViewController 设置为相同的 UINavController/UITableViewController,一切都会按预期工作。

由于某种原因,通过 segue 转换然后执行 UISearchBar 导致崩溃。

更新 1

我现在在点击一个字母时收到以下错误:

2015-02-03 12:23:35.262 Afar D[28348:2740681] -[NSNull length]: unrecognized selector sent to instance 0x10e352ce0
2015-02-03 12:23:40.313 Afar D[28348:2740681] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x10e352ce0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e0a9f35 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010dd42bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010e0b104d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010e00927c ___forwarding___ + 988
    4   CoreFoundation                      0x000000010e008e18 _CF_forwarding_prep_0 + 120
    5   CoreFoundation                      0x000000010df89a7b CFStringCompareWithOptionsAndLocale + 219
    6   Foundation                          0x000000010d6822b7 -[NSString compare:options:range:] + 29
    7   UIKit                               0x000000010c5f53b4 -[UIPhysicalKeyboardEvent _matchesKeyCommand:] + 224
    8   UIKit                               0x000000010c53c12e -[UIResponder(Internal) _keyCommandForEvent:] + 285
    9   UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    10  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    11  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    12  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    13  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    14  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    15  UIKit                               0x000000010c53c197 -[UIResponder(Internal) _keyCommandForEvent:] + 390
    16  UIKit                               0x000000010c3d8f0a -[UIApplication _handleKeyUIEvent:] + 126
    17  UIKit                               0x000000010c5c7fcc -[UIKeyboardImpl _handleKeyEvent:executionContext:] + 66
    18  UIKit                               0x000000010c75bbb7 -[UIKeyboardLayoutStar completeRetestForTouchUp:timestamp:interval:executionContext:] + 3611
    19  UIKit                               0x000000010c75a8e5 -[UIKeyboardLayoutStar touchUp:executionContext:] + 1374
    20  UIKit                               0x000000010c5d531b __28-[UIKeyboardLayout touchUp:]_block_invoke + 242
    21  UIKit                               0x000000010cb23914 -[UIKeyboardTaskQueue continueExecutionOnMainThread] + 332
    22  UIKit                               0x000000010c5d521c -[UIKeyboardLayout touchUp:] + 252
    23  UIKit                               0x000000010c5d5cc6 -[UIKeyboardLayout touchesEnded:withEvent:] + 319
    24  UIKit                               0x000000010c40b308 -[UIWindow _sendTouchesForEvent:] + 735
    25  UIKit                               0x000000010c40bc33 -[UIWindow sendEvent:] + 683
    26  UIKit                               0x000000010c3d89b1 -[UIApplication sendEvent:] + 246
    27  UIKit                               0x000000010c3e5a7d _UIApplicationHandleEventFromQueueEvent + 17370
    28  UIKit                               0x000000010c3c1103 _UIApplicationHandleEventQueue + 1961
    29  CoreFoundation                      0x000000010dfdf551 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    30  CoreFoundation                      0x000000010dfd541d __CFRunLoopDoSources0 + 269
    31  CoreFoundation                      0x000000010dfd4a54 __CFRunLoopRun + 868
    32  CoreFoundation                      0x000000010dfd4486 CFRunLoopRunSpecific + 470
    33  GraphicsServices                    0x000000010fc109f0 GSEventRunModal + 161
    34  UIKit                               0x000000010c3c4420 UIApplicationMain + 1282
    35  My App                              0x000000010a5e1c63 main + 115
    36  libdyld.dylib                       0x000000010e75a145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我正在使用 ios8 的新 UISearchController 来管理 UISearchBar 以过滤表格中的数据。如果我激活UISearchBar,应用程序会在我输入第一个字母时立即崩溃(有趣的是,屏幕键盘不会出现在模拟器中,但我认为这不相关)。

为了缩小范围,我已经评论了我的UIViewController 中的几乎所有内容,因此UITableView 不会呈现任何内容。我已经实现了UISearchControllerDelegateUISearchBarDelegate,这样我就可以在每个方法被调用时记录下来。但是,在输入第一个字母后,我没有收到任何控制台消息。我什至不知道我可以在哪里设置断点。

这是我得到的崩溃:

-[NSNull length]: unrecognized selector sent to instance 0x107602ce0

请注意,在我的文件中,我没有在任何地方调用长度。幕后的东西是,但我不知道是什么。

这是我设置 UISearchController 的代码:

- (void)viewDidLoad

    [super viewDidLoad];

    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.definesPresentationContext = true;
    self.searchController.hidesNavigationBarDuringPresentation = false;
    [self.searchController.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchController.searchBar;

    self.searchController.searchBar.delegate = self;
    self.searchController.delegate = self;

根据要求,这是我的委托方法(实施只是为了查看在输入第一个字母后是否调用了任何东西 - 他们没有):

#pragma mark - UISearchResultsUpdating

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


#pragma mark - UISearchControllerDelegate

- (void)didDismissSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (void)didPresentSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (void)presentSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (void)willDismissSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (void)willPresentSearchController:(UISearchController *)searchController

    NSLog(@"%s", __PRETTY_FUNCTION__);


#pragma mark - UISearchBarDelegate

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

    NSLog(@"%s", __PRETTY_FUNCTION__);
    return true;


- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

    NSLog(@"%s", __PRETTY_FUNCTION__);
    return true;


- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar

    NSLog(@"%s", __PRETTY_FUNCTION__);


- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar

    NSLog(@"%s", __PRETTY_FUNCTION__);
    return true;


- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar

    NSLog(@"%s", __PRETTY_FUNCTION__);

【问题讨论】:

你能提供搜索栏的代理代码吗? 您正在向空对象发送“长度”消息。我猜想搜索栏中的文本为空,而控制器中的某些内容正在尝试读取其长度。如果没有更多关于您在哪里设置搜索内容或委托方法的代码,很难判断 使用self.searchController.definesPresentationContext = YES; 请注意,您应该使用YESNO 而不是truefalse @flexaddicted,我已经实现了 UISearchBar 委托方法,并且只是 NSLogging 方法的名称。但是,在 UISearchBar 中键入第一个字母后,不会调用 UISearchBarDelegate 方法。我将definesPresentationContext 切换为true,但没有帮助。 可以添加委托代码吗? 【参考方案1】:

NSNull 只是一个用于表示 null 的单例对象。它传统上用于在无法处理 nil 条目的容器(数组和字典)中包装 nil 值。

在解析 json 并尝试将结果添加到集合中时,经常会出现此错误。

你是否在你的委托方法中做这样的事情?

编辑:从您发送到该 NSNull(长度)的消息来看,您可能会得到一个“空”结果,因为您要求的字符串不应该是 nil。

【讨论】:

感谢您的提示,但为了降低所有复杂性,我基本上已经注释掉了代码中的所有内容,但 viewDidLoad(上图),所需的 TableView 委托/数据源方法(呈现为空0 行的表),以及所有 UISearchBarDelegate、UISearchController Delegate 和 UISearchResultsUpdating 委托方法。所有这些方法都只是简单地记录它们的方法名称。我的文件中没有任何地方在任何地方调用长度,并且在输入第一个字母后,没有调用任何委托方法(从我的控制台中没有任何内容这一事实可以看出) 那么下一步就是在表格视图中搜索 NSStrings。特别是 UILabel 实例。如果你删除它们怎么办?您是否持有对其中任何一个的弱引用? 我已将表格视图数据源/委托方法中的所有内容都注释掉,因此屏幕上不会出现任何单元格。我的文件中也没有字符串。很奇怪。【参考方案2】:

在为此苦苦挣扎了一整天之后,它归结为一个完全不相关的问题:一个损坏的故事板。

This SO question 建议找出损坏的场景并重新创建它。不幸的是,我无法确定这一点,因此经过反复试验,它最终成为我故事板中的初始视图控制器,恰好是UINavigationController。我删除了它,重新添加了它,一切都是金色的。

【讨论】:

以上是关于输入 UISearchBar 会使我的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

更改为横向会使我的 Android 应用程序崩溃

为啥这个旧的依赖会使我的 gradle 崩溃?

为啥大型本地数组会使我的程序崩溃,而全局数组却不会? [复制]

为啥 ntdll.dll 会使我的 c++ 可执行文件崩溃?

为啥 __inbyte 会使我的软件崩溃?

激活 iPhone 相机操作会使我的应用程序崩溃 [重复]