2011-05-05 73 views
5

有時不會調用我有一個簡單的應用程序,其中我有一個表視圖&取決於與數組我使用reloadData方法重新加載表數據的方法。最初加載前5-10次,這個表視圖沒有任何問題。有時玩過應用程序後,我發現表格視圖是空白的,因爲框架沒有調用cellForRowAtIndexPath。我驗證了datasource & delegate設置正確& numberOfRowsInSection正在返回一個有效的正數。一旦我看到空白表視圖,我可以反覆看到這個空白視圖,直到我退出應用程序。我在控制檯中沒有收到任何錯誤或警告。我試圖調整數組,但無濟於事。cellForRowAtIndexPath有時在調用numberOfRowsInSection後調用reloadData

下面是代碼:

- (void)notifyArrayLoaded:(NSArray *)arr { 
    NSUInteger capacity = [arr count]; 
    _tbDataArray = [[NSMutableArray alloc] initWithCapacity:capacity]; 

    // _tbDataArray is filled with the data from arr 

    // Reload the table data 
    [_tableView reloadData]; 
} 

任何線索將高度讚賞。

在此先感謝。 Sumit

嗨DeanWombourne,我沒有viewDidUnLoad方法,但我有viewWillDisAppear方法,我在這裏發佈它。

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 

    UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
    UIView *view = [window.subviews objectAtIndex:0]; 

    view.transform = CGAffineTransformIdentity; 
    view.transform = CGAffineTransformMakeRotation(0); 
    view.bounds = CGRectMake(0.0, 0.0, 320, 480); 
} 

這是記錄爲tableView的日誌。

[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
<UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
+0

您的通知是否始終在主線程上運行? – deanWombourne 2011-05-05 08:56:32

+0

你如何處理內存警告/ viewDidUnload - 你可以添加該方法到你的問題? – deanWombourne 2011-05-05 09:01:03

+0

您可以添加'NSLog(@「%@」,_tableView)行;'在重新載入數據之前 - 您的tableView有可能爲零? – deanWombourne 2011-05-05 09:02:05

回答

5

如果reloadData原因numberOfRowsInSection被稱作但不cellForRowAtIndexPath,請檢查你叫reloadDataUITableView實例是,你已經顯示在您的看法相同UITableView,例如我想你會發現你有兩種不同的UITableViews。然後解決這個難題爲什麼...

0

轉到viewcontroller的頭文件並添加(IBOutlet)到tableView成員。 然後通過接口連接b

10

請確保您在主線程上調用reloadData。如果要以異步加載數據使用performSelectorInBackground並在方法調用reloadData,你應該,而不是做這樣的事情:

[tableViewController reloadData] 

什麼,你應該做的是

[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO] 
+0

謝謝,這對我有用 – 2016-01-22 11:49:48

0

這可能爲時已晚,但無論如何這可能會有所幫助。我面臨同樣的問題。

總之可能是「Florian Segginger的」答案是對的。

我的情況是 1.calling Web服務異步獲取數據(拉刷新) 2.雖然這是處理,移動到另一個視圖控制器(推) 3.poped回來,我的應用程序崩潰。

因此,在步驟2和步驟3之間,我注意到表格的行數和段數實際上被調用,但行的單元格沒有。當我由於另一個邏輯而改變了tablecell的計數時,它恢復了。通過測試來處理這個問題,如果view在連接中可見,確實加載完成,因爲我正在重新加載table in view會出現。這可能是由於行的單元格實際上是一個應該在主線程上運行的呈現(UI)操作。

0

我也有同樣的症狀。就我而言,我第一次在viewDidLoad中加載數據(來自核心數據)時,使用NSSortDescriptor對數據進行排序。

點擊一個按鈕後,核心數據再次被提取(這次更改)並重新載入tableView數據。它最初給我一個空白表視圖,點擊按鈕後,因爲我第二次提取它時忘記排序數據。

學習要點:如果您在開始時使用了它們,請記得調用所有修改單元格的方法,比如NSSortDescriptor!

相關問題