2017-06-20 92 views
0

有大量與此主題相關的問題,但我還沒有遇到過我的用例。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上做得很好)

謝謝。

+0

在'的initWithCoder:'嘗試做'self.dataSource = self'。 – Larme

+0

我真的很希望這不會是答案:(多數民衆贊成在如此粗略看。 – GoreDefex

+0

@Larme是的,它做到了:(提交一個答案,所以我可以upvote和最終確定這個問題。謝謝 – GoreDefex

回答

1

TasksTableView類是從UITableView派生類&您正在實施UITableview代表在同一​​類。這不起作用。

而不是創建一個UITableView子類。創建TasksTableView類爲NSObject子類。並通過tableview對象從你添加了一個tableview

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

,並設置表視圖委託給self(TasksTableView對象),而initTasksTableView

- (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

+0

是的,感覺比自己好一點.delegate = self ...沒有太多點好一點 – GoreDefex

+0

我只是認爲,因爲我已經繼承UITableView,它應該清楚地知道它是委託/數據源本身。 – GoreDefex

相關問題