UITableViewのヘッダーにUISwitchを追加および管理するための最良のアプローチを見つけようとしています。これまで、テーブルでUISwitchを使用するのに最適な方法に関するいくつかのリンクを読みました:ここ、ここ、およびここ。これらのリンクは、セルでUISwitchを使用しているのに対し、ヘッダーのカスタムUIViewで使用していることを示しています。そうは言っても、これらのオブジェクトを管理するためにタグを使用したいのですが、viewWithTagアプローチが機能しない理由を理解できません。
補足:実行時にUISwitchをNSMutableArrayに入れてそのように管理することはできましたが、それほど冗長ではなく、配列の境界違反/インデックスを管理したり、nilリストをチェックしたりすることはできませんでした...また、IBOutletsを使用してこれをどのように行うかは私にはわかりません。これが私がタグアプローチを試みている理由です。
私の目標は、スイッチを使用して各セクションの行を折りたたんだり展開したりすることです。そのため、viewForHeaderInSectionで返すUIViewにサブビューとしてUISwitchをタグ付けして追加することを考えました。その後、セルを折りたたむためにロジックを実行する必要があるときに、それらを再参照します。さらに、実行時に1つ以上のセクションを持つ可能性があるため、タグ番号をハードコーディングすることは実用的ではありません。そのメソッドのコードは次のとおりです。
仮定:
#define kSwitchTagRange 2000
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)];
// Add UISwitches and ensure that UISwitch doesn't already exist for this section...
UISwitch *switchView = (UISwitch*)[self.tableView viewWithTag:(kLayerSwitchTagRange + section)];
if (switchView == nil) {
// Create switch
switchView = [[UISwitch alloc] init];
double xOffset = self.tableView.bounds.size.width - switchView.frame.size.width;
switchView.frame = CGRectMake(xOffset,
7,
switchView.frame.size.width,
switchView.frame.size.height);
[switchView addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
// Should we tag the switch view?
switchView.tag = kSwitchTagRange + section;
}
// Add switch as subview
[view addSubview:switchView];
return view;
}
switchChangedの場合:テーブルのデータをリロードするだけです:
- (void)switchChanged:(id)sender {
[self.tableView reloadData];
}
最後に、テーブルのデータが再作成されるときに、UISwitchを取得してオン/オフ状態を判断しようとします。次に、セクションの行数がオフの場合は0を返し、オンの場合は他の数を返します。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSInteger rowCount = 0;
UISwitch *switchView = (UISwitch*)[self.view viewWithTag:(kSwitchTagRange + section)];
if (switchView != nil && switchView.isOn == NO)
{
rowCount = 0;
}
else
{
// Row count is something other than 0
rowCount = 3;
}
return rowCount;
}
残念ながら、このswitchViewは常にnilです。
いくつか推測がありますが、なぜこれが起こっているのか判断できません。
- 推測1:テーブルのデータが再ロードされたときに、必要なスイッチが追加されたUIViewの割り当てが解除されます。メモリに存在しないため、タグで検索しても見つかりません。
- 推測2:UISwitchをビューオブジェクトに誤って追加しています(多くの例で、オブジェクトがUITableViewCellのcontentViewに追加されているのを見てきましたが、viewForHeaderInSection:メソッドでUIViewを送り返しているので、それらがわかりませんここに例が適用されます。addSubviewは任意のオブジェクトをツリーに追加する必要があります。
上記のviewWithTagメソッドがnilを返す理由を誰かに教えてもらえますか?私は推測#1に傾倒していますが、カスタムヘッダーUIViewの割り当てがいつでも解除されることを示すドキュメントは見つかりませんでした。セルは再利用されますが、セクションヘッダーはどうですか?
最後に、私はこの投稿を読みました。タグの使用に関する推奨事項は理にかなっていますが、タグのアプローチはまったく嫌いなようです。タグの使用が面倒でなく、インテリジェントに使用されている場合は、タグを使用してみませんか?タグ機能が利用できるのはなぜですか?
本当に、私の場合、viewWithTagメソッドがnilを返す理由を知りたいだけです。
乾杯!