2009-10-22 69 views
5

解析Data類中的JSON數據後,我在同一Data類的fillArrays方法中設置了UIViewController的NSArray *標題屬性。在我的UIViewController的viewDidAppear方法中,我在我的UITableView上調用reloadData。 numberOfSectionsInTableView觸發並返回1,則numberOfRowsInSection觸發並返回4的數組數(對於數組中的4個字符串)。然而,控制永遠不會到cellForRowAtIndexPath,我最難理解爲什麼,特別是因爲我有有效的部分和行。細胞都是可見的。cellForRowAtIndexPath not called;部分返回1,行返回4

我已經將UITableViewDataSource和UITableViewDelegate協議添加到UIViewController接口,並將UITableView的委託和數據源設置爲viewDidLoad中的self(它也通過調用的行和段計數方法進行驗證)。

我想知道它是否與我重新初始化Data.m中的UIViewController以設置其屬性。

在Data.m:

- (void)fillArrays:(NSArray *)jsonObjs { 
    NSLog(@"fillArrays");    
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init]; 
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs]; 
    [hrvc viewDidAppear:NO]; 
} 

在ViewController.m:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"viewDidLoad"); 
    // Table view 
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain]; 
    [headlineTableView setDelegate:self]; 
    [headlineTableView setDataSource:self]; 
    // Temporary 
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil]; 



    [self.view addSubview:headlineTableView]; 
    self.headlineTableView = headlineTableView; 
    [headlineTableView release]; 
} 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"viewdidappear"); 
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines 
    if([self.headlines count] != 0){ 
     [self.headlineTableView reloadData]; 
    } 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    NSLog(@"numberOfSectionsInTableView: 1"); 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]); 
    return [self.headlines count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"cellForRowAtIndexPath"); 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]]; 

    return cell; 
} 
+0

你可能想要發表一些代碼 – coneybeare 2009-10-22 15:44:12

回答

4

在fillArrays,再創建一個視圖控制器 - 但你永遠不會做任何與它或它的觀點,你永遠不會看到這一觀點。您絕對不會手動調用viewDidAppear,這會在顯示視圖控制器視圖時自動發生(僅在導航控制器的上下文中)。

通常的流動是,創建視圖控制器和任何添加視圖作爲當前視圖的子視圖中,或將其推經由導航控制器的新窗口。我很確定你的整個問題是,他們的表永遠不會添加到任何人看到的視圖中,所以表調用其他方法,但從不調用cellForRow,因爲它的layoutSubviews代碼根本不被調用。

+0

就是這樣。我正在創建一個UIViewController的副本。我所要做的就是通過方法參數將引用傳遞給Data類。感謝大家在這裏的第一個問題的幫助。 – azdev 2009-10-22 20:36:59

0

檢查並確認的tableView委託和數據源都指向的viewController

0

我看不到代碼現在有什麼問題,你是否用斷點驗證過cellForRow永遠不會到達(即使我看到你有一個日誌語句)?

另外,我會嘗試一個健全性檢查,以顯式返回rowsInSection中的「1」,並硬編碼cellForRow中返回的單元格中的字符串。

如果一切都失敗了,從XCode模板創建一個新的表格視圖控制器,並將你的調用放在那裏 - 那麼當它工作時,向後回溯到你的代碼爲什麼沒有。

此外,它會很高興看到您的viewDidLoad設置代碼(添加回答上面請)。

0

如果您將代理和數據源設置爲viewDidLoad,那麼這可能是您的錯誤的來源。你可以在init中設置數據源和委託嗎?

+0

當我將UITableView代碼從viewDidLoad移動到init時,不幸的是,甚至沒有調用numberOfSectionsInTableView。 – azdev 2009-10-22 19:10:04

0

我不確定你是否將UITableView作爲子視圖添加到UIViewController.view。無論如何,這是我的方法。

在這種方法中,我發現執行沒有進入的cellForRowAtIndexPath直到我加入的UITableView作爲子視圖後發送UIViewController.view到後面。

得到這個地步只是問題的一部分。此時,我的其他視圖控制器似乎不再響應觸摸事件。我發現,當我還將UITableView作爲子視圖添加到rootViewController時,我所有的視圖都得到了適當的觸摸事件。

4

您是否已將tableView添加到UIViewController的視圖中?

它發生在我身上,當我加入這個

[self.view addSubview:table]; 
[table release]; 

然後cellForRowAtIndexPath開始工作。

+0

不錯,簡單。我認爲這就是肯德爾在上面所看到的,但這對我來說很有意義。謝謝! – 2012-03-14 00:53:47

4

對於谷歌的緣故:

如果tableView:numberOfRowsInSection回報不管出於什麼原因tableView:cellForRowAtIndexPath不會被調用,因爲沒有行稱之爲零。

+0

對於在家中的其他人,請確保您確保您的布爾邏輯在'numberOfRowsInSection'中是正確的。我是一名經驗豐富的iOS開發人員,我只是在過去的一個小時裏試圖弄清楚爲什麼我的單元格不顯示:在長時間檢查部分結束時,我的「else」條件是設置** rows = 0 **。 WOOF! – kyleturner 2013-01-29 07:38:25

0

非常感謝你pxl。當我移動的UITableView初始化從viewDidLoad中到:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil" 

它完美的作品當過我做刪除或更新一些行的UITableView被reloded到我UIView。