2009-10-19 10 views
14

UITableViewのセクションのヘッダタイトルを変更しようとしています。アプリケーションによってはtableView:titleForHeaderInSectionがトリガーされますので、それは役に立ちません。私はreloadDataと呼ぶことができますが、アプリケーションはすべての可視セルを再読み込みする必要があるため、パフォーマンスが低下します。カスタムヘッダーも使用しようとしましたが、パフォーマンス上の問題が発生します。テーブルビューなしのUITableViewセクションヘッダを変更する:titleForHeaderInSection

UILabelへのハンドルを取得して、デフォルトのヘッダービューで使用するテキストを手動で変更する方法はありますか?

ありがとうございます!

答えて

14

システム提供セクションのヘッダービューにアクセスするための標準APIはありません。新しいヘッダーテキストを表示するためにUIKitを取得するには、よりターゲットを絞ったreloadSections:withRowAnimationを試しましたか?

カスタムセクションヘッダービューでどのようなパフォーマンスの問題が発生しましたか?私は、標準のものが単なるUILabel以上のものであるとは思わない。

+0

少なくとも私のアプリのためにテーブル全体をリロードするほど遅いですが、reloadSectionsを使用する必要があるようです。私はCocoa APIによって毎回挫折してきました。私は円形キューを使ってUILabelのセットを再利用し、viewForHeaderでそれらを返すようにしましたが、viewForHeaderは非常に多くのセル(表示されていないものさえも)に対して呼び出されます。ただひどいです。アー! –

0

これはWAGです。なぜそれがうまくいかないのかという理由がたくさんあると思いますが、あなたはサブビューを通して繰り返して、あなたが探しているものを見つけることができませんでしたか?例えば。

for (UIView *v in self.tableView.subviews) { 
    // ... is this the one? 
} 
1

のUITableViewは、再利用のためのセクションヘッダの景色をエンキューおよびデキューされませんので、あなたにもそれがメモリ内のすべてのセクションヘッダのビューを保存することが可能かどう表示される場合があります。これを行うには、バックグラウンドなどで独自のセクションヘッダービューを作成する必要がありますが、柔軟性と機能が少し向上します。

セクションヘッダービューにタグを付けることもできます(独自のセクションヘッダービューを作成する必要があります)。必要に応じてテーブルビューから取得することもできます。

24

[tableView endUpdates]を呼び出すと、あまりにも多くのパフォーマンスが低下することなく、望ましい結果が得られる場合があります。

[self.tableView beginUpdates]; 
[self.tableView endUpdates]; 

// forces the tableView to ask its delegate/datasource the following: 
// numberOfSectionsInTableView: 
// tableView:titleForHeaderInSection: 
// tableView:titleForFooterInSection: 
// tableView:viewForHeaderInSection: 
// tableView:viewForFooterInSection: 
// tableView:heightForHeaderInSection: 
// tableView:heightForFooterInSection: 
// tableView:numberOfRowsInSection: 
+1

iOS10/11(swift)で 'tableView:viewForHeaderInSection:'と 'tableView:viewForFooterInSection:'が呼び出されていないので、あなた自身でビューを変更する必要があります –

13

:あなたはあなたのビューだけで自動生成されたラベルですが、あれば、それは手動で

これでも動作します私は、セクションのビューを取得し、「更新」ができ

[self.tableView headerViewForSection:i] 

自分でサイズを変更する必要があります。 あなたがしようとするので:

[self.tableView headerViewForSection:i].textLabel.text = [self tableView:self.tableView titleForHeaderInSection:i]; 

テキストを設定しますが、ラベルのサイズを設定していないでしょう。あなたはそれを自分で設定したNSStringから必要なサイズを取得することができます。ソリューションの

[label.text sizeWithFont:label.font]; 
+0

ハッキリしていますが、元の質問でだから+1。 – bioffe

+2

[self.tableView headerViewForSection:i]いつもnilの値を与えます –

+0

あなたはヘッダーを持っていない場合、つまり、ストーリーボードには静的なセルが作成され、テキストには "ヘッダー" )。 –

0

一つは、ラベルの参照を含む複数のセクションヘッダーの外部の配列を管理し、外部からそれらを更新することです。

3

セクションヘッダーラベルのタイトルを直接設定できます。例えば、セクションゼロのタイトルを設定する:

UITableViewHeaderFooterView *sectionZeroHeader = [self.tableView headerViewForSection:0]; 
NSString *sectionZeroLabel = @"Section Zero"; 
[sectionZeroHeader.textLabel setText:[sectionZeroLabel uppercaseString]]; 
[sectionZeroHeader setNeedsLayout]; 

はそうでない場合、新しいテキストが切り捨てられることがあり、必ずそれはレイアウトが必要なセクションヘッダのビューを教えてください。また、セクションラベルは通常すべて大文字です。

+0

に設定することもできます。これは、自動高さを使用している場合は機能しないようです。 – lostintranslation

関連する問題