テーブルビューのヘッダーに追加したボタンが機能しない

SPECIAL


UITableView の tableHeaderView に配置した UIButton が反応しない

iOS アプリの UITableView は、ヘッダーやフッターとしてビューを配置するための tableHeaderView プロパティと tableFooterView プロパティを持っています。

これらのプロパティに UIView から派生したコントロールを設定することで、その内容を UITableView のセルとは別に、上側または下側に表示することができるようになっています。

 

ただ、これに、インターフェイスビルダーで作成した UIView をプログラムから設定してみたところ、その UIView に配置されている UIButton を押せないことがありました。

このときの UITableViewController のプログラムは、次のような感じです。

// ヘッダーに設定するビューのコントローラーを準備しています。

MyHeaderViewController* headerController = [[MyHeaderViewController alloc] initWithNibName=@"MyHeaderViewController bundle:nil];

 

// テーブルヘッダーにビューを設定しています。

self.tableView.tableHeaderView = headerController.view;

このようにしても、実行時に UIView の内容はテーブルヘッダーに表示されるものの、そこに配置されている UIButton を押しても、押された動作がまったく動作しませんでした。押されたときに青くなる動作もない感じです。

 

この原因は、どうやら tableHeaderView に UIView を設定するのを、メインスレッドではないところで実行していた様子です。

iOS では仕様上、ユーザーインターフェイスの描画に関係する処理はメインスレッドで実行しなければいけないため、ここでは次のようにして、tableHeaderView への代入をメインスレッドで実行するようにしました。

// ここでは、テーブルヘッダーにビューを設定する処理をメインスレッドで実行させています。

[self.tableView performSelectorOnMainThread:@selector(setTableHeaderView:) withObject:headerController.view waitUntilDone:YES];

このようにすることで、テーブルビューのヘッダーに配置した UIView 上のボタンがちゃんと押せるようになりました。