有大量與此主題相關的問題,但我還沒有遇到過我的用例。Objective-c UITableView單獨的類cellForRowAtIndexPath不會被調用
這是我的最初幾週中OBJ-C,所以我不知道什麼,我有一些這方面的東西做...
我想要的東西
我並不特別喜歡看在OBJ-C中有很多類使用這個地球上的每一個函數來重載視圖控制器類。就OOP而言,它看起來很髒並且感覺很嚴重。在我的使用案例中,我沒有一個全屏桌面只是一個小東西來保存10件事情。因此,使用完整的UITableViewController是不合適的。相反,我想讓所有我的表委託特定的方法在UITableView子類中。不在UITableViewController或具有UITableView屬性的ViewController中。這應該是超級簡單又...
的問題
不管我做什麼,我似乎無法得到的方法cellForRowAtIndexPath
火。我知道足夠的知道,這東西很大程度上依賴於委託和數據源分配...但是,因爲我有一個單獨的UITableView類使用<UITableViewDelegate, UITableViewDataSource>
代表團,我不認爲我應該做任何形式的任務!
我該怎麼寫? self.delegate = self
?或者更糟的是,在調用這個UITableView類的ViewController中,self.tasksTable.delgate = self.tasksTable
? Eww ... gross
這是我在做的代碼。
守則
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上做得很好)
謝謝。
在'的initWithCoder:'嘗試做'self.dataSource = self'。 – Larme
我真的很希望這不會是答案:(多數民衆贊成在如此粗略看。 – GoreDefex
@Larme是的,它做到了:(提交一個答案,所以我可以upvote和最終確定這個問題。謝謝 – GoreDefex