25

我已将UITableViewInterface Builder 中的行高设置为 54.0。我UISearchDisplayController对此有看法。当用户点击其中的搜索栏时,表格会正确调整大小。但是,当他们开始输入(并实际进行搜索)时,行高会减小。在搜索点击Cancel之前,它一直是错误的。

我在 Apple 的网站上找不到有关此行为的文档。

我尝试在UISearchDisplayDelegate委托调用中设置行高。这可能是正确的方法,但我不知道细节,也无法让它发挥作用。

我也尝试过实施- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;. 这行得通,但是我在此列表中有数千个条目,并且无法承受性能损失。

解决这个问题的正确方法是什么?

4

8 回答 8

56

正确的方法是使用以下委托。

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    tableView.rowHeight = 54.0f; // or some other height
}

UITableView它在创建或显示时调用。

如果你碰巧searchDisplayController.searchResultsTableView在没有执行搜索时调用了其他代码,它会提前创建 UITableView。如果您使用willShow委托方法设置rowHeight,如果事先创建了 tableView,它将错过更改 rowHeight 的时间(由于某种原因)。

于 2012-02-02T09:16:21.487 回答
16

我找到了!

假设表存储在tableView

- (void)viewDidLoad;
{
    [super viewDidLoad];
    self.searchDisplayController.searchResultsTableView.rowHeight = tableView.rowHeight;
}

没有其他必要了。

编辑:请参阅 netmikey 的答案以获得更好的解决方案。

于 2010-04-14T18:39:03.020 回答
10

史蒂夫,您的解决方案对我不起作用:第一次搜索结果显示正常,但是当用户点击“取消”(关闭搜索栏)然后重新打开它并在其中输入搜索词时,身高又错了。

DigDog 的使用解决方案searchDisplayController:didShowSearchResultsTableView有点工作,但用户在搜索开始时看到单元格高度“跳跃”。

我发现解决这两个问题的解决方案是使用:

- (void)searchDisplayController: (UISearchDisplayController *)controller 
 willShowSearchResultsTableView: (UITableView *)searchTableView {

    searchTableView.rowHeight = myTableView.rowHeight;
}

……在UISearchDisplayDelegate

问候, netmikey

于 2011-05-04T08:59:07.780 回答
3

在 viewDidLoad 中:

您可以将搜索显示控制器的委托设置为 self:

- (void)viewDidLoad 
{
    self.searchDisplayController.delegate = self;
}

然后,在视图控制器中实现表视图委托:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableview == self.searchDisplayController.tableView) {
        return 55;
    } else if (tableView == self.tableView) {
       return  44;
     }
}
于 2012-11-23T03:08:12.230 回答
1

覆盖方法 didLoadSearchResultsTableView 应该可以解决问题。

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView {
    tableView.rowHeight = 82.0; // Change height of search result row
}

此博客的更多解释

于 2012-02-08T03:32:41.990 回答
0

你需要同时设置

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {    
    return 54.;
}

self.tableView.rowHeight = 54.;

也在你的 UISearchDisplayDelegate

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
    tableView.rowHeight = 54.; 
}

否则,当搜索出现“无结果”时,单元格高度将回退到默认值。

于 2010-04-14T18:01:15.817 回答
0

我一直在使用 ios 7.0 和 Xcode 5.0。我认为您应该在此方法中更改行高:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    // Return the number of rows in the section.
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        tableView.rowHeight = ...;// change your row height here!
        return [self.searchResults count];
    }
    else
    {
        ...
        return ...;
    }
    }

因为每次tableview试图显示它的布局时,都会调用这个方法,所以每次在搜索栏中输入一个字母,都会调用这个方法,并且行高不会有机会改变。

于 2014-01-14T12:51:09.483 回答
-1

没有一个解决方案对我有用......

做了我自己的打击和试验......并让它工作......

如果您想要普通和搜索表视图的不同行高...

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// for normal results
     if (tableView==self.tableView) return 54;
// for search results
     else return 54; }

如果你想要共同的身高......

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
     return 54; }

PS:请记住,如果每行具有相同的行高,则此方法在资源使用方面不是很有效,因为为每个单元格重新计算行高......虽然,这在大多数情况下并不明显,我仍在寻找更好的解决方案!

于 2011-06-05T19:13:39.907 回答