[英]When to remove subview from UITableViewCell?
我有一個帶有searchBar
和searchDisplayController
的UITableView
。 我想要做的是在沒有找到結果時顯示一個button
。 因此用戶可以搜索服務器的數據庫。 我有一個NSMutableArray
來存儲searchResults
。 所以我的委托方法看起來像這樣:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"titulo contains [cd] %@", searchText];
NSArray *filtroUsuario = [self.objects filteredArrayUsingPredicate:predicate];
self.searchResults = [[NSMutableArray alloc] initWithArray:filtroUsuario];
if (self.searchResults.count < 1) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 320, 50);
btn.showsTouchWhenHighlighted = YES;
[btn setTitle:@"Procurar no Banco de Dados" forState:UIControlStateNormal];
btn.tag = 1;
[self.searchResults addObject:btn];
self.adicionar = YES;
}
}
基本上,當沒有結果時,我創建並向結果array
添加一個button
。 然后,在cellForRowAtIndexPath
,我有以下內容:
if (tableView == self.searchDisplayController.searchResultsTableView) {
if (self.adicionar == YES) {
cell.textLabel.text = @"";
[cell.contentView addSubview:self.searchResults[indexPath.row]];
self.adicionar = NO;
}
這button
完全按照我想要的方式顯示,當按下cancelButton
或有問題的button
時,我只是將其從searchResults
中刪除,以防用戶再次搜索。 [self.searchResults removeAllObjects]
。
問題是,由於我正在重復使用單元格,當用戶再次搜索時, subview
仍然存在。 我有幾個選項來處理這個問題,我可以為單元格創建一個屬性,並在按下button
時刪除子視圖。 但我選擇包含行[[cell.contentView viewWithTag:1] removeFromSuperview];
在cellForRowAtIndexPath
的開頭,所以當它再次被調用時,它會在繼續之前刪除子subViews
。
現在一切都很完美。 我的問題是,這是最好的方法還是更簡單的方法。 由於我的應用程序是一個復雜的應用程序,我非常關注內存和性能,此外,我真的想學習最酷的技術。
有什么想法嗎?
看看UITableViewCell上的-prepareForReuse。 可能最適合您描述的確切情況。 (下面的草圖示例)
@interface CustomCellName : UITableViewCell
@property (strong, nonatomic) UIButton *someButton;
@end
@implementation
- (void)prepareForReuse
{
_someButton.hidden = YES;
//etc...
}
@end
標簽也很好,雖然許多人發現這種方法令人不滿意。 (*引證需要)
另一種方法是使用UIButton將UITableViewCell子類化為屬性,您可以通過-cellForRowAtIndexPath從tableView進行調整。
Best是一個靈活的術語 - 在哪方面最好......
你有什么工作,但這不是一個很好的責任分配。 最好創建一個自定義單元子類,並讓它提供一個可以添加自定義按鈕的API。 單元子類將處理prepareForReuse
按鈕的清理。
從記憶和性能的角度來看,差別不大。 但是使用細胞亞類更正確。
為了提高性能,最好不要創建和銷毀按鈕實例。 因此,對於您的單元子類來說,最好創建一個按鈕,但在需要之前將其隱藏,然后顯示它。 現在, prepareForReuse
只會隱藏按鈕。 通常這會平均使用更多的內存 - 這是一個折衷...
首先,將控件與您的應用數據混合不是一個好習慣。 您可以使它按現有的方式工作,但從長遠來看,它可以將UI與應用程序數據分開。 表視圖應該完成呈現操作數據的數據和控件的所有工作,因此最好在結果數組中添加字符串“No Data”,然后在cellForRowAtIndexPath中處理它。 在您的單元格上創建一個按鈕,只需在需要時隱藏/顯示它。 不要擔心內存消耗,單元格是可重用的,因此您將擁有非常少量的按鈕(隱藏的按鈕)。
第二件事,如果你真的不打算只創建一個按鈕然后標記它,例如,當你決定需要它時創建它並標記為1000.然后當你重新加載但不想顯示它時,只要問你的單元格如果它有一個標簽== 1000的視圖並從superview中刪除它。 但是,如果你為每個可見細胞創建一個按鈕,那么它就是一種矯枉過正,你的記憶完整性也不會受到威脅。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.