当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃

Posted

技术标签:

【中文标题】当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃【英文标题】:While UISearchBar is active,scrolling to UITableView app get crashes 【发布时间】:2016-02-26 06:47:41 【问题描述】:

我的应用程序运行良好,但突然当我点击UISearchBar 并且当我向下滚动UITableView 时没有输入,然后应用程序崩溃并出现以下错误:Thread1 : EXC_BAD_INSTRUCTION

但是当我点击UISearchBar 并输入一些文本时,然后当我向下滚动UITableView 时,应用程序运行正常,它不会崩溃。

最后,当我点击UISearchBar 并输入一些文本并删除所有这些文本时,当我向下滚动UITableView 时,应用程序运行正常,它不会崩溃。

此函数发生错误:

 func tableView(historyTableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = historyTableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell;
        //self.historyTableView.scrollEnabled = true
        if(searchActive)
//...Error occurs over here ==>> Thread1 : EXC_BAD_INSTRUCTION
            cell.textLabel?.text = filtered[indexPath.row]  
         else 
            cell.textLabel?.text = data[indexPath.row]
        

        return cell;
    

【问题讨论】:

你能显示你的完整堆栈跟踪吗 使用异常断点将帮助您找出崩溃的确切位置。 当您的过滤数组中的任何错误存在于您在表格视图中滚动的索引时,可能会发生这种情况,请检查过滤数组元素。 【参考方案1】:

我的猜测是,当您开始主动搜索时,您并没有重新加载表格。我也猜想nunberOfRowsInSection: 不处理主动搜索的情况。如果这些情况属实,那么只要您滚动到大于filtered.count 的行,调用filtered[indexPath.row] 就会使您的应用崩溃

【讨论】:

你的numberOfRowsInSection: 方法是什么样的?【参考方案2】:

希望你也用numberOfRowsInSection 方法处理了filtereddata 数组。

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    if(searchActive)

        return filtered.count

    else

        return data.count
    

现在您只需在点击 UISearchBar 时将您的 searchActive 设置为 true

func searchBarTextDidBeginEditing(searchBar: UISearchBar) 
    searchActive = true;
 

希望这会有所帮助!

【讨论】:

【参考方案3】:

通过这种方式,我已经克服了这个问题。

func tableView(historyTableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = historyTableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell;
        if(searchActive)
            if(searchBar.text=="")
            
                //do nothing

            else
                cell.textLabel?.text = filtered[indexPath.row]
            

         else 
            cell.textLabel?.text = data[indexPath.row]
        

        return cell;
    

【讨论】:

现在应用在滚动时不会崩溃,因为我已经通过添加条件来处理这个问题,如果 seachbar 为空则什么都不做。

以上是关于当 UISearchBar 处于活动状态时,滚动到 UITableView 应用程序会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持 UISearchBar 处于活动状态的同时强制 UITableView 重新加载数据?

当 UIRefreshControl 处于活动状态时,字母滚动条会向下移动?

当带有glassEnabled的GWT DialogBox处于活动状态时,阻止页面滚动

当 UISearchBar 变为活动状态时,UISearchResultsTableView 不会出现

搜索控制器处于活动状态时出现表格视图时隐藏的第一行

允许 UIScrollView 在长按处于活动状态时通过第二次触摸滚动