0

問題:在我的應用程序中,我使用故事板中的模態segue呈現UIViewController。 該viewController有一個UITableView和用戶可以選擇一個單元格。然後我解僱了那個viewController然後回去。我想要做的是再次顯示控制器時,所選單元格將突出顯示。所以我想將所選單元格的indexPath保存在屬性中,並在viewWillAppear中將該單元格突出顯示。但是當viewController被提交時,它的屬性是零。所以,我的問題是:iOS:模態viewController如何記住它的屬性?

模式viewController如何記住它的屬性?

+1

第二次展示它時,它是視圖控制器的另一個實例。呈現控制器可以保存模態控制器,並且每次重新呈現相同的實例。或者,另一個對象可以記住選擇了哪些項目。這個對象可能是你的數據模型,或者甚至更簡單地是呈現控制器中的一個屬性。您如何存儲它的決定取決於這些控制器在哪裏以及如何在您的應用程序中重用。 – 2014-09-04 01:43:56

+0

@Aaron Brager thanx男人!你說了什麼,工作得很好! 如果您願意接受它,請回答 – MrTourkos 2014-09-05 17:46:34

回答

0

您不能將索引路徑保存爲用戶默認值嗎?

let index = NSIndexPath(index: 35) 
    NSUserDefaults.standardUserDefaults().setValue(index, forKey: "savedIndex") 


    //Then in your viewwillappear 
    if let savedIndex = NSUserDefaults.standardUserDefaults().valueForKey("savedIndex") as? NSIndexPath { 
     //set the highlighted cell 
    } 

只是一個想法...

+0

Fyi,當問題要求Objective-C時,此答案在Swift中。 – WMios 2014-09-04 04:34:05

+0

是的,我的壞...好,你複製我的答案,並將其翻譯成Obj-C爲海報。 – Ron 2014-09-04 08:33:28

1

的基本問題是你混合模型和視圖控制器職責。

模型的責任是記住應用狀態。視圖控制器負責將數據綁定到視圖並驗證用戶輸入。

問題是每個人的祕籍。當您在視圖控制器中進行臨時狀態更改時,通常不需要將其分解爲模型,因爲視圖控制器和狀態數據具有相同的生命週期。

在你的情況下,狀態數據比視圖控制器有更長的生命週期。將這些數據分解成一個模型,然後將該模型應用到視圖控制器(單例,從持久存儲中讀取,在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; 
} 
+0

我對應用程序中發生的事情不甚瞭解。用戶選擇一個單元格女巫代表一個過濾前一個ViewController的UITableView的國家。這是否需要模型?我對iOS真的很陌生,我不明白MVC!謝謝! – MrTourkos 2014-09-04 02:00:01

+0

我在答覆中增加了一些內容。 – 2014-09-04 13:01:30

1

每次您展示模態視圖控制器時,它都是一個新實例。如果你想要一個新的實例記住你保存的屬性(比如indexPath),你可以將它保存到NSUserDefaults中,這樣你就可以重新訪問所有的東西,或者你可以呈現相同的模式視圖控制器。

你應該做的是每次都呈現相同的模式視圖控制器,以便它記住屬性。

使用方法NSUserDefaults的:

你有一個屬性,把它_indexPath

NSString *indexPathString = [NSString stringWithFormat: @"%@", _indexPath]; 
[[NSUserDefaults standardUserDefaults] setObject: indexPathString forKey: @"Index_Path"]; 

並獲取indexPath只是這樣做:

(在-(void) viewWillAppear

NSString *indexPathString = [[NSUserDefaults standardUserDefaults] objectForKey: @"Index_Path"]; 
// convert indexPathString to indexPath and save as _indexPath 
+1

感謝您的回答,但我不認爲NSUserDefaults是存儲這些東西的合適位置。正如我所說,我在這裏真的很新,所以也許我錯了。再次感謝! – MrTourkos 2014-09-05 17:45:02

+0

我編輯了我的答案。如果不想使用NSUserDefaults,則每次只能顯示相同的模式視圖控制器。 – WMios 2014-09-05 18:09:12