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