Objective-c UITableView单独的类cellForRowAtIndexPath不会被调用

关于这个主题的问题有很多,但我还没有碰到我的用例,所以在这里。

这是我在OBJ-C的第一个几周,所以我不知道我在做些什么…

我想要的是

我并不是特别喜欢在OBJ-C中看到这么多的类,使用这个地球上的每一个函数来重载视图控制器类。 它看起来肮脏,并感到严重的OOP去。 在我的使用情况下,我没有一个全屏幕的桌子只是一个小东西来保存10件事情。 因此,使用完整的UITableViewController是不合适的。 相反,我想让我所有的表代表特定的方法在UITableView子类。 不在UITableViewController或具有UITableView属性的ViewController中。 这应该是简单而又…

问题

无论我做什么我似乎无法获取方法cellForRowAtIndexPath触发。 我知道足够的知道,这东西很大程度上依赖于委托和数据源分配…但是,因为我有一个单独的UITableView类使用<UITableViewDelegate, UITableViewDataSource>委托,我不认为我应该做任何forms的任务根本!

我要写什么? self.delegate = self ? 或者更糟的是,在调用这个UITableView类的ViewController中, self.tasksTable.delgate = self.tasksTable ? 呃…毛

这是我在做的代码。

代码

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对象…但是迄今为止我所做的所有tuturials都倾向于使用一些奇怪的ad-hoc NSArray或NSDictionary来关联索引表函数与数组或字典键的索引…这使我非常困惑,为什么我不能只设置DataSource对象,并让表知道迭代它的数据。

我的结论是,这不是射击,因为它认为DataSource对象是空的,没有行? (这是,但正如我所说的,人们似乎让YouTube在YouTube上正常工作)

谢谢。

TasksTableView类是从UITableView类派生&你正在实现UITableview代表在同一​​个类。 这是行不通的。

而不是创build一个UITableView子类。 创buildTasksTableView类作为NSObject子类。 并从你添加tableview地方传递tableview对象。

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

并且在init TasksTableView类时将该表视图委托设置为self (TasksTableView对象)

 - (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方法将触发特定的tableview