web-dev-qa-db-ja.com

テーブルビュー全体を再読み込みせずにUITableViewのセクションヘッダー/フッターのタイトルを変更する

[tableView reloadData];を呼び出さずにテーブルビューのセクションヘッダー/フッターを再読み込みする方法はありますか?

実際、テーブルビューのセクションのセクションフッターにセルの数を表示したいと思います。テーブルビューは編集可能で、次を使用して行を削除または挿入します

– insertRowsAtIndexPaths:withRowAnimation:
– deleteRowsAtIndexPaths:withRowAnimation:

これらのメソッドはセクションフッターを更新しないようです。奇妙なことに、これらのメソッドを呼び出すと、テーブルビューのデータソースメソッド

- (NSString *)tableView:(UITableView *)table titleForFooterInSection:(NSInteger)section 

(2回!)と呼ばれますが、テーブルビューを新しい値で更新しません!!

誰もがこの問題を修正する方法を知っていますか?

29
Ali

私はそれを間接的に行うことができました。UILabelを作成し、セクションヘッダー/フッターとして設定しました。

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    // update sectionFooterView.text    
    return sectionFooterView;
}

- (void)viewDidLoad {
    // create sectionFooterView in Interface Builder, change the frame here
    // use Font-size:15 , BG-Color: clearColor , text-Color: RGB=(97,105,118) 
    // and Text-alignment:Center to look like table view's original footer
    sectionFooterView.frame = CGRectMake(0, 10, 320, 12);
}

カスタムフッタービューを設定せずにこれを行う方法を誰かが知っていますか?

7
Ali

基本的なテキストヘッダーまたはフッターしかない場合は、直接アクセスできます。

[tableView footerViewForSection:indexPath.section].textLabel.text = [self tableView:tableView titleForFooterInSection:indexPath.section];

同様にヘッダーについて:

[tableView headerViewForSection:indexPath.section].textLabel.text = [self tableView:tableView titleForHeaderInSection:indexPath.section];
35
Nico teWinkel

これはうまくいくはずです:

    UIView.setAnimationsEnabled(false)
    tableView.beginUpdates()

    if let containerView = tableView.footerViewForSection(0) {
        containerView.textLabel!.text = "New footer text!"

        containerView.sizeToFit()
    }

    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
16
Craig Miller

これは、Swift 3.0で行う方法です。

tableView.beginUpdates()
tableView.headerView(forSection: indexPath.section)?.textLabel?.text = "Some text"
tableView.endUpdates()
3
Daniel Tovesson

これを行う別の方法を次に示します。

UITableViewHeaderFooterView *headerView=[self.tableView headerViewForSection:1];
CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionFade;
animation.duration = 0.35;
[headerView.textLabel.layer addAnimation:animation forKey:@"kCATransitionFade"];
headerView.textLabel.text=[self tableView:self.tableView titleForHeaderInSection:1];
[headerView.textLabel sizeToFit];
3
hyperspasm

UITableView、より具体的には-reloadSections:withRowAnimation:のドキュメントを確認してください

2
Tim

このようにすることもできます

override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {
    switch section {
        case 0:
            return "Some string"
        default:
            return ""
    }
}
1
Adam Golczak

テキストが1行の入力から複数の行の入力に変わり、1行に戻ると、フッターテキストが正しく更新されないことがわかりました。ラベルの幅と高さをリセットすると、この問題が解決します。

    UIView.setAnimationsEnabled(false)
    textLabel.frame = CGRect(x: textLabel.frame.minX,
                             y: textLabel.frame.minY,
                             width: 0,
                             height: 0)
    tableView.beginUpdates()
    textLabel.text = "Your text"
    textLabel.sizeToFit()
    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
0
mukaissi