私は、UITableViewDataSourceとUITableViewDelegateプロトコルを実装している私のプロジェクト内にいくつかのUIViewControllerを持っています。 Interface BuilderではUIViewを削除し、それをサブクラス化されたUITableViewに置き換えました。私のサブクラス化されたUITableViewでカスタムのbackgroundViewを設定しました。UIViewController、UITableViewのサブクラス化 - 私のソリューションが汚いと感じる
@interface FFTableView : UITableView
@end
@implementation FFTableView
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
self.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];;
return self;
}
@end
これはすべて正常に動作します。これらのUIViewControllerのうち、すべてがUITableViewsをサブクラス化しており、すべて私のバックグラウンドイメージを描画しています。私の背景イメージは暗いので、セクションヘッダーを描画して可視にする必要があります。グーグルで私はHow to change font color of the title in grouped type UITableView?を見つけて、私はサブクラスにviewForHeaderInSectionを実装しています。
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
...
私のviewForHeaderInSectionは呼び出されません。もちろん、私はそれについて少し考えましたが、意味があります。私のUIViewControllerは、UITableViewDataSourceとUITableViewDelegateを実装するオブジェクトです。私がviewForHeaderInSectionをUIViewControllerの1つに配置すると、うまく動作します。
しかし、私はこれらのUIViewControllerの半ダースを持っています。これらはすべて異なるクラスにサブクラス化され、異なる機能を実装しています。だから、サブクラス化されたUIViewControllerとUIViewControllerの間にクラスを配置することにしました。このようにしてセクションヘッダーの外観を設定する共通のコードは、半ダースのスポットではなく、1つのスポットになります。ここで一つだ、
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
NSString *sectionTitle = [self tableView:tableView titleForHeaderInSection:section];
if (sectionTitle == nil) {
return nil;
}
...
とFFViewControllerから派生する私の他のサブクラス化のコントローラーを変更します:
@interface FFViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end
、ここで私が実装viewForHeaderInSection:
は、だから私は書く@interface FooDetailsViewController : FFViewController
ちょっと奇妙に見えますが、外観コードは2か所にありますが、それはhaviよりも優れています場所のいたるところに散らばっている同じコードのコピー。 FooDetailsViewControllerでは、私はテーブルプロトコルメソッドのいくつかを実装しますが、viewForHeaderInSectionは実装しません。私はFFViewControllerについて警告を出します。これは、すべてのプロトコル(この例では子クラスFooDetailsViewControllerがプロトコルを満たしています)を実装していないためです。
これはどういう意味ですか?
他のサブクラス化されたUIViewControllerのすべてがtitleForHeaderInSectionに応答するわけではありません。したがって、実行すると、これらのView Controllerでクラッシュします。だから私はtitleForHeaderInSectionが実装されているかどうか試してみます:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
if (![self respondsToSelector:@selector(titleForHeaderInSection)]) {
return nil;
}
NSString *sectionTitle = [self tableView:tableView titleForHeaderInSection:section];
if (sectionTitle == nil) {
return nil;
}
そしてrespondsToSelectorは常にfalseを返します。だから、私はそのセクションを削除し、すべての私のサブクラスがtitleForHeaderInSectionを実装するように強制することができますが、それは間違っているようです。
このような状況の良い方法はありますか?私はすでにソリューションを嫌っています:
- コードには警告があります。(しかし、私は常にそれらを停止するHow to avoid "incomplete implementation" warning in partial base classを行うことができます)
- マイ外観コードは、私はそれがセクションヘッダ
respondsToSelector
コードで (ここまで読んでくれてありがとう!)
あなたが本当にわかっていれば本当にすみません。 UITableView Delegateを持つすべてのコントローラに、同じ種類のセルがあるかどうかを私に教えてください。サイズとテキストがそれらのセルにどのようにあるのかを意味します。.. – WaaleedKhan
@追加:あなたが望むあなた自身の質問があると思います聞く、質問する。新しい質問を作成するだけです。 –
その意味を知っておくべきです – WaaleedKhan