2012-04-18 12 views
0

私は、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を実装するように強制することができますが、それは間違っているようです。

このような状況の良い方法はありますか?私はすでにソリューションを嫌っています:

  1. コードには警告があります。(しかし、私は常にそれらを停止するHow to avoid "incomplete implementation" warning in partial base classを行うことができます)
  2. マイ外観コードは、私はそれがセクションヘッダ
を持っていないので、それを必要としないコードでtitleForHeaderInSectionを実装する必要がある2つの別々のクラス
  • でありますあなたはあなたがテストしているセレクタの間違った名前を与えているあなたのrespondsToSelectorコードで

    (ここまで読んでくれてありがとう!)

  • +0

    あなたが本当にわかっていれば本当にすみません。 UITableView Delegateを持つすべてのコントローラに、同じ種類のセルがあるかどうかを私に教えてください。サイズとテキストがそれらのセルにどのようにあるのかを意味します。.. – WaaleedKhan

    +0

    @追加:あなたが望むあなた自身の質問があると思います聞く、質問する。新しい質問を作成するだけです。 –

    +0

    その意味を知っておくべきです – WaaleedKhan

    答えて

    2

    。それは次のようになります。

    if (![self respondsToSelector:@selector(tableView:titleForHeaderInSection:)]) { 
        return nil; 
    } 
    

    あなたはそれがあなたのテストが動作するはずですし、あなたのサブクラスは、その後、必要に応じてtableView:titleForHeaderInSection:を実装したりすることはできません変更します場合。

    +0

    それはそれだった、ありがとう! –

    関連する問題