簡體   English   中英

何時從UITableViewCell中刪除子視圖?

[英]When to remove subview from UITableViewCell?

我有一個帶有searchBarsearchDisplayControllerUITableView 我想要做的是在沒有找到結果時顯示一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM