このトピックに関する膨大な数の質問がありますが、私はまだユースケースを巡っていません。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がテーブルをうまく動かしているようだ。)
ありがとう。
のためにトリガされます
init
TasksTableView
クラスながらself
(TasksTableViewオブジェクト)にそのテーブルビューのデリゲートを設定します'、 'self.dataSource = self'を実行してみてください。 – Larme私は本当に本当にそれが答えではないことを望んでいた:(thats so gross looking。 – GoreDefex
@Larme yepそれをしました:(回答を提出するので、私はupvoteしてこの問題を確定することができますありがとう – GoreDefex