0

UITableView独自のカスタムで拡張するクラスを作成しようとしていますDataSource

クラスはと呼ばれSHCTableViewます。

最初に、SHCTableViewDataSource.hを拡張するというプロトタイプクラスを作成しましたNSObject

SHCTableView.h次に、プロパティを次のように追加します。

// the object that acts as the data source for this table
@property (nonatomic, assign) id<SHCTableViewDataSource> dataSource;

警告が表示されます

Property type 'id<SHCTableViewDataSource>' is incompatible with type 'id<UITableViewDataSource>' inherited from 'UITableView'

とでSHCTableView.m

const float SHC_ROW_HEIGHT = 50.0f;

-(void)refreshView {
  // set the scrollview height
  _scrollView.contentSize = CGSizeMake(_scrollView.bounds.size.width, [_dataSource numberOfRows] * SHC_ROW_HEIGHT);

  // add the cells
  for (int row=0; row < [_dataSource numberOfRows]; row++) {

    // obtain a cell
    UIView* cell = [_dataSource cellForRow:row];

    // set its location
    float topEdgeForRow = row * SHC_ROW_HEIGHT;
    CGRect frame = CGRectMake(0, topEdgeForRow, _scrollView.frame.size.width, SHC_ROW_HEIGHT);
    cell.frame = frame;

    // add to the view
    [_scrollView addSubview:cell];

  }

}

#pragma mark - property setters
-(void)setDataSource:(id<SHCTableViewDataSource>)dataSource {

  _dataSource = dataSource;
  [self refreshView];

}

のすべてのインスタンスで_dataSourceエラーが発生します。

Instance variable '_dataSource' is private

他にもたくさんのエラーがありますが、これらはすべてプライベートであるという事実が原因であると思われます_dataSource。これはおそらく上記の警告に関連しています。

どんな助けでも大歓迎です。

4

1 に答える 1

0

UITableViewはすでにdataSourceを宣言しているため、同じ名前として宣言することはお勧めできません。宣言するだけ

@property (nonatomic, assign) id<SHCTableViewDataSource> customDataSource;

それから

-(void)setDataSource:(id<SHCTableViewDataSource>)dataSource {
[super setDataSource:_dataSourceInterceptor]
  _customDataSource = dataSource;

 [self refreshView];

}

あなたがそれをしなければならないなら、あなたはそれをこのように行うことができます。

中間オブジェクトをdataSourceInterceptorとして作成し、スーパークラスの元のdataSourceを設定し、dataSource関数を実装します。自己をdataSourceに設定しないでください。これは良い考えではありません。

于 2013-03-12T23:07:30.510 に答える