UISearchDisplayController更改行高

时间:2010-04-14 17:51:39

标签: iphone uitableview uisearchdisplaycontroller

我已将界面生成器中的UITableView行高设置为54.0。我对该视图有一个UISearchDisplayController。当用户点击其中的搜索栏时,表格会正确调整大小。但是,当他们开始键入(并且实际进行搜索)时,行高度会降低。在搜索点击取消之前,它会出错。

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

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

我也尝试过实施- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;。这很有效,但是我在此列表中有数千个条目,并且不会影响性能。

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

8 个答案:

答案 0 :(得分:55)

正确的方法是使用以下代理。

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

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

如果您在未执行搜索时碰巧在其他代码中调用searchDisplayController.searchResultsTableView,则会提前创建UITableView。如果使用willShow委托方法来设置rowHeight,如果事先创建了tableView,则会因为某种原因而错过更改rowHeight的时间。

答案 1 :(得分:16)

我找到了它!

假设该表存储在tableView

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

没有其他必要。

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

答案 2 :(得分:10)

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

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

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

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

    searchTableView.rowHeight = myTableView.rowHeight;
}

...在UISearchDisplayDelegate

此致 netmikey

答案 3 :(得分: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;
     }
}

答案 4 :(得分:1)

重写方法didLoadSearchResultsTableView应该可以解决问题。

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

来自this blog

的更多解释

答案 5 :(得分: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.; 
}

否则,当搜索中出现“No Result”时,单元格高度将恢复为默认值。

答案 6 :(得分: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尝试显示其布局时,都会调用此方法,因此每次在搜索栏中键入一个字母时,都会调用此方法,并且行高度将无法更改。

答案 7 :(得分:-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:请记住,如果每行的行高相同,则此方法的资源使用效率不是很高,因为每个单元格都会重新计算行高...尽管如此,这一点并不明显大多数情况下,我仍在寻找更好的解决方案!