我已将界面生成器中的UITableView
行高设置为54.0。我对该视图有一个UISearchDisplayController
。当用户点击其中的搜索栏时,表格会正确调整大小。但是,当他们开始键入(并且实际进行搜索)时,行高度会降低。在搜索点击取消之前,它会出错。
我在Apple的网站上找不到关于此行为的文档。
我已尝试在UISearchDisplayDelegate
委托调用中设置行高。这可能是正确的方法,但我不知道细节,也无法使其发挥作用。
我也尝试过实施- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
。这很有效,但是我在此列表中有数千个条目,并且不会影响性能。
解决这个问题的正确方法是什么?
答案 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
}
的更多解释
答案 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:请记住,如果每行的行高相同,则此方法的资源使用效率不是很高,因为每个单元格都会重新计算行高...尽管如此,这一点并不明显大多数情况下,我仍在寻找更好的解决方案!