2012-03-14 11 views
0

我有一個UITableViewController,它使用NSMutableArray作爲其數據源。該數組最初通過調用Web服務來檢索數據並填充NSMutableArray,將其填充到viewDidLoad方法中。然後,用戶可以選擇輸入搜索詞(在UISearchBar中)並按搜索重新運行Web服務並重新填充表列表。此時我需要清空數組並重新填充Web服務結果中的表。我的問題是什麼是正確的方式來做到這一點,而不會破壞表視圖的重繪?我可以看到2個選項:Objective C - 用NSMutableArray清空並重新加載UITableViewController的正確方法

  1. 調用[listArray removeAllObjects];然後[[self tableView] reloadData];在重新填充數組之前。

  2. 由於我將列表限制爲最多200行,因此使用200個項目初始化數組,然後在搜索運行時不使用刪除和重新添加,而是使用[listArray replaceObjectAtIndex:替換每一行。這將需要一個int變量來保持返回的行數,並在'tableView numberOfRowsInSection'方法中使用它,所以tableview只顯示返回的行數。

希望有道理!我問這個問題是因爲我在重新加載列表時遇到了一些間歇性錯誤(EXC_BAD_ACCESS),我確信這是與我如何清空並重新加載列表有關,因此可以使用關於最佳方法的一些建議。

任何幫助理解,

喬納森

UPDATE:

代碼初始化數組中viewDidLoad中:

tableListDataArray = [[NSMutableArray alloc] init]; 

一旦數據被檢索,它被添加到陣列如下:

CustSuppListItem *custSuppItem = [[CustSuppListItem alloc] init]; 
[custSuppItem setAcCode:[jsonCustSuppRecord getStringForKey:@"acCode"]]; 
[custSuppItem setAcCompany:[jsonCustSuppRecord getStringForKey:@"acCompany"]]; 
[custSuppItem setAcContact:[jsonCustSuppRecord getStringForKey:@"acContact"]]; 
[custSuppItem setOsBalBase:[jsonCustSuppRecord getDoubleForKey:@"osBalBase"]]; 
[custSuppItem setAcAccStatus:[jsonCustSuppRecord getIntForKey:@"acAccStatus"]];        
[tableListDataArray addObject:custSuppItem];       
[custSuppItem release]; 

陣列處於dealloc方法公佈如下:

[tableListDataArray release]; 
+0

只需更換數組,然後調用reloadData就足夠了。除非你真的想要,否則不需要removeAllObjects。你的錯誤很可能是由自動釋放陣列造成的。您能否提供聲明數組變量的代碼以及您設置值的方式? – Jeremy 2012-03-14 19:55:01

+0

嗨傑里米,感謝您的回覆 - 我已經添加了我使用我的原始問題上面的代碼。對於'reloadData', – 2012-03-14 20:30:31

回答

2

我個人使用選項1.去你應該只能夠使用

[tableView reloadData] 

沒有「自我」。 reloadData也會調用cellForRowAtIndexPath方法我相信 不要忘記在使用它之前初始化你的NSMutableArray。

myMutableArray = [[NSMutableArray alloc] initWithCapacity:9001]; 
+0

+1。 「self」是否需要或有用取決於「tableView」是一個變量還是一個屬性。如果它是一個屬性,那麼使用提供的訪問器是合理的:'[self tableView]'或'self.tableView'。 – Caleb 2012-03-14 20:34:23

相關問題