第二次设置belongsText时,UILabel丢失文本属性

时间:2015-02-09 23:24:18

标签: ios objective-c uitableview uilabel uisearchcontroller

我正在使用iOS 8中引入的UISearchController API实现搜索。我有一个UITableViewController子类,既可以作为搜索结果控制器,也可以作为搜索结果更新程序。该控制器负责在表格视图中显示搜索结果。

每次searchBar中的文本发生更改时,搜索API都会在我的表视图控制器上调用UISearchControllerUpdating方法-updateSearchResultsForSearchController:。在此方法中,我根据新的搜索字符串更新搜索结果,然后调用[self.tableview reloadData]

我还试图突出显示结果列表中搜索字符串的出现次数。我通过将表格视图单元格中的attributedText设置为包含高光的属性字符串来实现此目的。

我看到以下行为:

  1. 第一次击键后,高亮显示正确
  2. 第二次击键后,所有高光消失,除了
  3. 如果某个单元格在字符串的开头有一个突出显示的区域,它将显示所有高光,即使在字符串的其余部分也是如此
  4. 经过一些试验和错误,我发现这似乎与表视图或单元格没有任何关系,并且与UILabel有关。似乎第二次设置attributedText属性时标签总是松开高亮显示。我真的只能设置一次吗?

    我的一些代码

    表视图数据源:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        NSString* plainCell = @"plainCell";
        UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:plainCell];
    
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:plainCell];
        }
    
        JFDHelpEntry* entry = searchResults[indexPath.row];
        cell.textLabel.attributedText = [self highlightedString:entry.title withSearchString:currentSearchString];
    
        return cell;
    }
    

    生成文本的方法突出显示:

    - (NSAttributedString*)highlightedString:(NSString*)string withSearchString:(NSString*)searchString
    {
        NSMutableAttributedString* result = [[NSMutableAttributedString alloc] initWithString:string];
        NSArray* matchedRanges = [self rangesOfString:searchString inString:string];
    
        for (NSValue* rangeInABox in matchedRanges) {
            [result addAttribute:NSBackgroundColorAttributeName value:[UIColor yellowColor] range:[rangeInABox rangeValue]];
        }
    
        return result;
    }
    

    找到要突出显示范围的方法:

    - (NSArray*)rangesOfString:(NSString*)needle inString:(NSString*)haystack
    {
        NSMutableArray* result = [NSMutableArray array];
        NSRange searchRange = NSMakeRange(0, haystack.length);
        NSRange foundRange;
    
        while (foundRange.location != NSNotFound) {
            foundRange = [haystack rangeOfString:needle options:NSCaseInsensitiveSearch range:searchRange];
    
            if (foundRange.location != NSNotFound) {
                [result addObject:[NSValue valueWithRange:foundRange]];
    
                searchRange.location = foundRange.location + foundRange.length;
            }
    
            searchRange.length = haystack.length - searchRange.location;
        }
    
        return result;
    }
    

    有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我现在确信我的问题是由UIKit中的一个错误造成的,我已经报道过了。你可以看到它on openradar

解决方法是检查字符串的开头是否有高亮显示,如果没有,则添加0-1范围内的清晰背景颜色属性。