的基本問題是你混合模型和視圖控制器職責。
模型的責任是記住應用狀態。視圖控制器負責將數據綁定到視圖並驗證用戶輸入。
問題是每個人的祕籍。當您在視圖控制器中進行臨時狀態更改時,通常不需要將其分解爲模型,因爲視圖控制器和狀態數據具有相同的生命週期。
在你的情況下,狀態數據比視圖控制器有更長的生命週期。將這些數據分解成一個模型,然後將該模型應用到視圖控制器(單例,從持久存儲中讀取,在segue中應用,...:有很多方法可以做到這一點)。
由於您提供的信息很少,我可以想到如何實現這一點。
有一個模型,其中包含陣列allItems
,currentItems
,countries
。有一個currentCountry
財產。覆蓋-setCurrentCountry:
重建currentItems
。
- (void)setCurrentCountry:(MyCountryModel *)currentCountry
{
_currentCountry = currentCountry;
self.currentItems = [self filterAllItemsByCountry:currentCountry];
}
項目視圖控制器將包含模型的一個實例。當國家視圖控制器被推入時,模型可以在繼續傳遞。國家視圖控制器將使用countries
作爲其數據源。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
cell = …
MyCountryModel *country = self.model.countries[indexPath.row];
cell.selected = country == self.model.currentCountry;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCountryModel *country = self.model.countries[indexPath.row];
self.model.currentCountry = country;
}
第二次展示它時,它是視圖控制器的另一個實例。呈現控制器可以保存模態控制器,並且每次重新呈現相同的實例。或者,另一個對象可以記住選擇了哪些項目。這個對象可能是你的數據模型,或者甚至更簡單地是呈現控制器中的一個屬性。您如何存儲它的決定取決於這些控制器在哪裏以及如何在您的應用程序中重用。 – 2014-09-04 01:43:56
@Aaron Brager thanx男人!你說了什麼,工作得很好! 如果您願意接受它,請回答 – MrTourkos 2014-09-05 17:46:34