iOS UISearchDisplayController 防止 tableview 改变背景颜色(背景保持灰色)

Posted

技术标签:

【中文标题】iOS UISearchDisplayController 防止 tableview 改变背景颜色(背景保持灰色)【英文标题】:iOS SearchDisplayController prevents tableview from background color change (background stays gray) 【发布时间】:2014-04-12 05:33:29 【问题描述】:

这可能是 ios 7 中的一个错误: 我使用故事板将 Search Bar 和 Search Display Controller 拖入我的 tableview 控制器中。之后我的 tableview 的背景颜色发生了变化。 我正在使用 AppCoda 的“how-to-add-search-bar-uitableview”中的示例来演示此问题。我只在ViewDidLoad 中使用 1 行插件更改了示例代码:

   [_tableView setBackgroundColor:[UIColor blackColor]];

在此处查看我的屏幕截图:

    tableview 的底部已经变成黑色:

    尽管 tableview 的背景设置为黑色,但顶部仍为灰色: 这只发生在我拖动“搜索栏和搜索显示控制器”时。如果我从情节提要中删除“搜索显示控制器”,一切都很好。

【问题讨论】:

我整天都在做这个。我尝试只拖入搜索栏,没有问题。请在此处查看屏幕截图 (dropbox.com/s/dnlqajb3wz9vdvo/2014-04-11%2022.45.40.png)。但是,只要我以编程方式添加 SearchDisplayController,问题就可以重现。 如果你想重现这个错误,只需查看我在此处使用的示例“appcoda.com/how-to-add-search-bar-uitableview”,并更改了 tableview 的背景颜色。 【参考方案1】:

UITableViewController 中使用UISearchDisplayController 时,请务必记住您正在处理两个表视图。

因此,当您将“搜索栏和搜索显示控制器”拖到 UITableView 中时(假设您在 UIStoryboard 中执行此操作),您实际上会添加另一个 UITableView,激活时必须由您的UITableViewController 文件中的代码以与任何其他UITableView 相同的方式管理。

考虑一下:

代表完整数据集的 UITableView 可以使用self.tableView(或者如您所写,合成的_tableView)调用。

表示过滤后的数据集(使用您的搜索条件过滤)的 UITableView 可以使用self.searchDisplayController.searchResultsTableView 调用

如果您希望默认 UITableView 和搜索 UITableView 背景颜色都显示黑色,我可以建议此代码(在我的应用中的 TVC 中工作)...

- (void)viewDidLoad 
    [super viewDidLoad];

    [self.tableView setBackgroundView:nil];
    [self.tableView setBackgroundColor:[UIColor blackColor]];

    [self.searchDisplayController.searchResultsTableView setBackgroundView:nil];
    [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor blackColor]];

...

更新

现在我已经完成了我的冗长的讲座,我同意 Xcode 实际上存在某种“错误”。如果您删除原来的UISearchBar,然后在UITableViewController 中添加一个新的,则在连接之前,请执行构建并运行。在表格视图的和上方下方可以看到黑色背景。只有在您将UISearchBar 设置为UISearchDisplayController 的出口后,黑色背景才会被灰色背景“替换”。

所以解决方案...

感谢Olof对Different background colors for the top and bottom of a UITableView的回复。

替换我在上面写的代码,在你viewDidLoad方法的末尾:

- (void)viewDidLoad 
    [super viewDidLoad];

    ...<other code>...

    CGRect frame = self.tableView.bounds;
    frame.origin.y = -frame.size.height;
    UIView* viewBackgroundBlack = [[UIView alloc] initWithFrame:frame];
    [viewBackgroundBlack setBackgroundColor:[UIColor blackColor]];
    [self.tableView addSubview:viewBackgroundBlack];

    [self.tableView setBackgroundView:nil];
    [self.tableView setBackgroundColor:[UIColor blackColor]];

    [self.searchDisplayController.searchResultsTableView setBackgroundView:nil];
    [self.searchDisplayController.searchResultsTableView setBackgroundColor:[UIColor blackColor]];

【讨论】:

我试过了,但它似乎不起作用。想知道你是否尝试过并让它发挥作用。让我知道你把这段代码放在哪里。 阅读此developer.apple.com/library/ios/documentation/UIKit/Reference/… 包括行'[searchTableView setBackgroundView:nil];' 另外,您引用的 AppCode 教程的 URL 似乎不再有效 - 试试这个 - appcoda.com/search-bar-tutorial-ios7 不幸的是,我试过了,但还是不行。我将这 4 行放在 ViewDidLoad 中,但没有变化: [self.tableView setBackgroundColor:[UIColor blackColor]]; UITableView *searchTableView = self.searchDisplayController.searchResultsTableView; [searchTableView setBackgroundColor:[UIColor blackColor]]; [searchTableView setBackgroundView:nil];【参考方案2】:

UISearchBar 设置为 Storyboard 中的标题视图时会出现问题。在UIView 中包装UISearchBar 似乎可以解决问题,但会带来与UISearchDisplayController 兼容性有关的其他问题。

我侵入了 UI,基本上发现 UITableView 在其顶部边缘和标题视图之间放置了一个存根视图,它是 UITableView 层次结构中的第一个子视图。更改其背景颜色将不起作用,因为它会在每次滚动位置更改时更新。

所以我的解决方案是简单地将 alpha 值归零。因此,我们将背景颜色委托给UITableView 本身。它在 iOS 7.1 上运行良好,在这种情况下似乎是一个轻量级补丁。

//
// Fix background color bug
// This patch can be applied once in viewDidLoad if you use UITableViewController
// http://***.com/q/23026531/351305
//
- (void)_fixSearchBarHeaderViewBackgroundColorBug 
    // First subview in UITableView is a stub view positioned between table's top edge and table's header view.
    UIView* stubView = [self.tableView.subviews firstObject];

    // Make sure it's stub view and not anything else
    if([NSStringFromClass([stubView class]) isEqualToString:@"UIView"]) 
        // Set its alpha to zero to use background color from UITableView
        stubView.alpha = 0.0f;
    

【讨论】:

【参考方案3】:

我尝试使用:self.tableView.backgroundView = [UIView new];。成功了!

【讨论】:

上述想法都不起作用,除了你的。干杯

以上是关于iOS UISearchDisplayController 防止 tableview 改变背景颜色(背景保持灰色)的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别