0

静的セルを含む UITableView があり、検索によって、検索に一致しないセルが非表示になります。非表示のセルの行の高さを設定する方法はありますか。if ステートメントを使用しようとしましたが、非表示のセルではなく、テーブルビュー内のすべてのセルが変更されてしまいます。

基本的に、セルが非表示のときに行の高さも変更できるかどうか疑問に思っていました

編集申し訳ありませんが、質問を投稿したときにコードから離れていました

現時点では、静的セルを備えた UITableView と、検索表示コントローラーを備えた検索バーがあります。検索バーのコードは以下のとおりです

@property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
@property (strong, nonatomic) IBOutletCollection(UITableViewCell) NSArray *cells;
@property(nonatomic) CGFloat rowHeight;




@implementation tableViewController

@synthesize searchBar;  
@synthesize cells;  
@synthesize rowHeight;  






- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
for(UITableViewCell *cell in self.cells) 
{
    UILabel *label = cell.textLabel;
    NSString *text = label.text;
   cell.hidden = searchText.length != 0 && ([text rangeOfString:searchText options:NSCaseInsensitiveSearch].location == NSNotFound);

    if (cell.hidden) {


        rowHeight = 10;

    }


       }

}

これは、一致しないセルを非表示にするものです。私が抱えている問題は、セルが非表示のときにディスプレイのスペースを占有し、スペースを節約して見栄えを良くするために、非表示のセルを0または1の高さに設定してスペースを節約することです(10動作するようになるまで例として使用されます)、すべてが整列するようにします。検索バーがキャンセルされるかクリックされると、すべての行の高さが 44 に戻ります。このコードでは、非表示のセルだけでなく、すべてのセルが 10 に設定されます。

4

1 に答える 1

0

行の高さは次の方法で制御されます

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

したがって、行を非表示にするときに、これを行っているときに、その特定の行を再ロードできます。上記のメソッドは、セルの BOOL をチェックし、それを使用して返される高さを決定できます。

ただし、目的を達成する別の方法があります。

これは、テーブルをフィルタリングする方法の例です。テーブルの上部に標準の UISearchBar があり、検索テキストでこのメソッドを呼び出します: (メソッド呼び出しの一部は私のプロジェクトの一部です..しかし、アイデアを得る必要があります)

基本的に、テーブルビューに別のデータ配列を与えてから、テーブルをリロードします。検索がキャンセルされた場合、または searchText が空白の場合、元の tableData が取得されます。

- (void) performSearchWithText:(NSString *)searchText {
    [super performSearchWithText:searchText];
    if ([searchText length] > 0) {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title contains[cd] %@", searchText]; 
        NSArray *filteredArray = [[self.setListController sets] filteredArrayUsingPredicate:predicate];
        self.tableData = [NSArray arrayWithArray:filteredArray];
        [self.tableView reloadData];
    } else {
        self.tableData = [self.setListController sets];
        [self.tableView reloadData];
    }
}

これは私にとってはうまくいきます。

編集者...........

さて、あなたがやっている方法でそれを続けたいなら..これを試すことができます..あまり効率的ではないように見えますが、32個のセルしかないので、問題ないはずです. ただし、理想的には、データとビューを分離したいので、データを検索してビューに更新を指示します。現在、ビュー内のテキストを検索しています。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {    
    [self.hiddenCells removeAllIndexes];
    for(UITableViewCell *cell in self.cells) {
        UILabel *label = cell.textLabel;
        NSString *text = label.text;
        BOOL shouldHide = searchText.length != 0 && ([text rangeOfString:searchText options:NSCaseInsensitiveSearch].location == NSNotFound);
        if (shouldHide) {
            [self.hiddenCells addIndex:[self.tableView indexPathForCell:cell]];
       }         
    }
    [self.tableView reloadData];
}


- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.hiddenCells containsIndex:indexPath) {
        return 0.0f;
    } else {
        return 40.0f;
    }
}

次のプロパティも作成する必要があります。 @property (非アトミック、保持) NSMutableIndexSet *hiddenCells;

于 2012-06-24T20:26:35.480 に答える