2016-06-26 18 views
0

私は私がBaseTableProviderUITableViewデリゲートメソッドが呼び出されない?

//BaseTableProvider.h 
@protocol RSTableProviderProtocol <NSObject> 

- (void)cellDidPress:(NSIndexPath *) atIndexPath; 

@optional 
- (void)cellNeedsDelete:(NSIndexPath *) atIndexPath; 

@end 

@interface RSBaseTableProvider : NSObject <UITableViewDelegate, UITableViewDataSource> 

@property (nonatomic, strong) NSMutableArray *dataSource; 
@property (nonatomic, weak) id<RSTableProviderProtocol> delegate; 

@end 
//BaseTableProvider.m 
@implementation RSBaseTableProvider 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return 1; 
} 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return 0; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [[UITableViewCell alloc]init]; 
    return cell; 
} 
@end 

と呼ばれる基本クラスへのUITableViewデリゲートメソッドを抽出しようとすると、私はBaseTableProviderのサブクラスを作成し、

//RSFeedListTableProvider.h 
@interface RSFeedListTableProvider : RSBaseTableProvider 

@end 

//RSFeedListTableProvider.m 
@implementation RSFeedListTableProvider 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return [self.dataSource count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    RSFeedCell *cell = (RSFeedCell *)[tableView dequeueReusableCellWithIdentifier:kFeedCell]; 

    if(cell == nil){ 
     cell = [[RSFeedCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kFeedCell]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    Feed *feed = (Feed *)self.dataSource[indexPath.row]; 

    if (feed != nil) { 
     cell.titleText = feed.title; 
     cell.subTitleText = feed.summary; 
    } 


    return cell; 
} 

@end 

サブクラス二つUITableViewDelegateメソッドをオーバーライドmはViewControllerでListTablerProviderを初期化しました。

//RSFeedListViewController.m 
@implementation RSFeedListViewController 

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ 
    _feedListView = [[RSFeedListView alloc] init]; 

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 

    _provider = [[RSFeedListTableProvider alloc] init]; 
    _provider.delegate = self; 

    return self; 
} 

#pragma mark -- Life Cycle 

- (void)loadView{ 
    RSFeedListView *aView = [[RSFeedListView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

    self.feedListView = aView; 
    self.view = aView; 

    self.feedListView.tableView.delegate = _provider; 
    self.feedListView.tableView.dataSource = _provider; 
} 

しかし、私はscreen.I上に構築されたセルを参照することはできませんが、コードがRSFeedListTableProviderでのUITableViewのデリゲートメソッドは、1が私を助けて?ありがとうできcalled.Anyていなかったことがわかったdebuged!

+0

いくつかの観測....いくつかのセクションでは、いくつの行が返されているのかわかりません。また、ストーリーボードやxibから 'RSFeedListViewController'をロードしている場合は、nib名バージョンではなく' init'の "decoder"バージョンを呼び出します。あなたは 'self.feedListView.tableView.delegate = _providerで_provider''の値を印刷する場合、私はコードを貼り付け忘れ –

+0

@PhillipMillsは、私がBaseProvider.m –

+0

内のセクションの数を返す; '、あなたが何を見ていますか? –

答えて

0

私はあなたのサブクラスRSFeedListTableProvidernumberOfRowsInSectionデータソースメソッドを実装していなかったと思います。だから、あなたがゼロを戻ってきているので、あなたのサブクラスでcellForRowAtIndexPathが呼び出されません決してスーパークラスの実装

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return 0; 
} 

、そこを呼び出します。
解決策はサブクラスにnumberOfRowsInSectionを実装し、適切な数を返します

+0

はい!私はnumberOfRowsInSectionとnumberOfSectionを間違えています。本当にありがとうございます! –

0

たぶん、あなたがNSObjectの代わりのUITableViewControllerを継承しています!プロパティUITableView * tableViewを作成し、UITableViewController dataSourceに接続してデリゲートする必要があります。

+0

は私がfeedListViewと呼ばれるのtableViewクラスを持っていた、そしてRSFeedListViewController.mでデータソースとデリゲートを割り当てます(コードセクション3) –

+0

しかし、あなたのRSBaseTableProviderは、NSObjectのを継承しています。 –

関連する問題