2017-06-20 2 views
0

このトピックに関する膨大な数の質問がありますが、私はまだユースケースを巡っていません。Objective-c UITableViewの別のクラスcellForRowAtIndexPathが呼び出されない

これは私が

たい私は特に見て楽しんでいない

...ので、私はこのようなもののいくつかでやっているものを見当もつかないOBJ-Cでの私の最初の数週間でOBJ-Cの非常に多くのクラスが、この地球上のすべての関数とすべての関数でView Controllerクラスをオーバーロードします。それは汚れて見え、OOPが行く限り総体的に感じる。私の使用事例では、10個のものを保持するためのフルスクリーンテーブルはありません。したがって、完全なUITableViewControllerを使用することは非常に不適切です。代わりに、私はすべての私のテーブルデリゲートの特定のメソッドをUITableViewサブクラスにするようにしたい。 UITableViewControllerまたはUITableViewプロパティを持つViewControllerにはありません。これは

問題がどんなに私は何をすべきか、私が発射する方法cellForRowAtIndexPathを取得するように見えることはできません...まだ簡単なメガでなければなりません。私はこのことがデリゲートとデータソースの割り当てに大きく依存していることを知るには十分知っています...しかし、<UITableViewDelegate, UITableViewDataSource>代表団を使用する別個のUITableViewクラスがあるので、私は割り当てを一切行わなければならないとは思わない!

私は何を書きますか? self.delegate = self?このUITableViewクラスを呼び出すViewControllerでself.tasksTable.delgate = self.tasksTable? Eww ...グロス

ここで私はコードで何をしているのですか?

コード

TasksTableView.h

#import <UIKit/UIKit.h> 

@interface TasksTableView : UITableView <UITableViewDelegate, UITableViewDataSource> { 
    NSArray *tasksData; 
} 

- (NSMutableArray *)getAllTasks; 

@end 

TasksTableView.m

#import "TasksTableView.h" 
#import "NSObject+RemoteFetch.h" //<--I use this to fetch, obvs 

@interface TasksTableView() 
@property (nonatomic, strong) NSString *cellId; 
@end 


@implementation TasksTableView 

- (instancetype)initWithCoder:(NSCoder *)coder { 
    self = [super initWithCoder:coder]; 

    if(self) { 
     _cellId = @"AllTasksTableCell"; 
     tasksData = [self getAllTasks]; 
    } 

    return self; 
} 


#pragma mark - Custom Table Functionality 

- (NSMutableArray *)getAllTasks { 
    @try { 
     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
     NSString *TASKS_URL = [userDefaults objectForKey:@"tasksUrl"]; 

     NSObject *fetcher = [[NSObject alloc] init]; 
     NSDictionary *response = [fetcher fetchAPICall:TASKS_URL httpRequestType:@"GET" requestBodyData:nil]; 

     return [response objectForKey:@"data"]; 

    } @catch (NSException *exception) { 
     NSLog(@"could not get tasks, error: %@", exception); 

     return nil; 
    } 
} 


#pragma mark - UITableView DataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [tasksData count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    //<-- NEVER GETS HERE 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:_cellId]; 

    if(cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:_cellId]; 
    } 

    cell.textLabel.text = [tasksData objectAtIndex:indexPath.row]; 

    return cell; 
} 

@end 

私はまたのように設定するかを考え出す苦労しています情報元。他の言語では、通常、self.DataSource = [self getAllTasks]でDataSourceオブジェクトを設定します...しかし、私がこれまで行ってきたすべての方法は、奇妙なアドホックなNSArrayまたはNSDictionaryを使用して、テーブル関数のインデックスと配列または辞書のキー...これは、私がDataSourceオブジェクトを設定して、テーブル上でデータを繰り返し処理することを知ることができない理由について私を非常に混乱させます。

私の結論は、DataSourceオブジェクトが空であり、行がないと考えているため、これが発生していないことです。 (これはそうだけど、私が言っているように、これでYouTubeがテーブルをうまく動かしているようだ。)

ありがとう。

+0

のためにトリガされますinitTasksTableViewクラスながらself(TasksTableViewオブジェクト)にそのテーブルビューのデリゲートを設定します'、 'self.dataSource = self'を実行してみてください。 – Larme

+0

私は本当に本当にそれが答えではないことを望んでいた:(thats so gross looking。 – GoreDefex

+0

@Larme yepそれをしました:(回答を提出するので、私はupvoteしてこの問題を確定することができますありがとう – GoreDefex

答えて

1

TasksTableViewクラスはUITableViewクラスから派生しました。&同じクラスにUITableviewデリゲートを実装しています。これは動作しません。

UITableViewサブクラスを作成する代わりに、サブクラスNSObjectとしてTasksTableViewクラスを作成します。tableviewを追加した場所のtableviewオブジェクトを渡します。

@interface TasksTableView : NSObject <UITableViewDelegate, UITableViewDataSource> { 
    NSArray *tasksData; 
    __weak UITableView *tableView; 
} 

そして

- (instancetype)initWithCoder:(NSCoder *)coder { 
    self = [super initWithCoder:coder]; 

    if(self) { 
     _cellId = @"AllTasksTableCell"; 
     tasksData = [self getAllTasks]; 
     self.tableView.delgate = self; 
     self.tableView.datasource = self; 
    } 

    return self; 
} 

今すぐあなたのdelegate方法はinitWithCoder `でその特定のtableview

+0

それは自己よりもちょっといい感じです.delegate = self ...ほんの少し上手くいきました。 – GoreDefex

+0

私はUITableViewを既にサブクラス化していたので、デリゲート/データソース自体がはっきり分かるはずです。 – GoreDefex

関連する問題