我有一個UITableViewController,它使用NSMutableArray作爲其數據源。該數組最初通過調用Web服務來檢索數據並填充NSMutableArray,將其填充到viewDidLoad方法中。然後,用戶可以選擇輸入搜索詞(在UISearchBar中)並按搜索重新運行Web服務並重新填充表列表。此時我需要清空數組並重新填充Web服務結果中的表。我的問題是什麼是正確的方式來做到這一點,而不會破壞表視圖的重繪?我可以看到2個選項:Objective C - 用NSMutableArray清空並重新加載UITableViewController的正確方法
調用[listArray removeAllObjects];然後[[self tableView] reloadData];在重新填充數組之前。
由於我將列表限制爲最多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];
只需更換數組,然後調用reloadData就足夠了。除非你真的想要,否則不需要removeAllObjects。你的錯誤很可能是由自動釋放陣列造成的。您能否提供聲明數組變量的代碼以及您設置值的方式? – Jeremy 2012-03-14 19:55:01
嗨傑里米,感謝您的回覆 - 我已經添加了我使用我的原始問題上面的代碼。對於'reloadData', – 2012-03-14 20:30:31