2

我有兩個視圖控制器 - 一個「主」視圖控制器,它顯示主要內容和一個「設置」表視圖控制器,該視圖控制器保存在一個幻燈片中的容器中視圖。概念是這樣的:Objective C與另一個視圖控制器通信另一個視圖控制器

  1. 用戶點擊設置面板上的項目。
  2. 設置TVC使用所有按鈕設置創建一個「Button States」字典對象。
  3. 按鈕狀態字典被傳遞給一個類,該類將按鈕狀態轉換爲主模型對象可以理解的設置字典。
  4. __ _ __ _ _ ???

此時,我需要通知主視圖控制器(其中包含我的主模型對象的實例)設置已更新,並且需要更新其模型對象上的設置。我如何去做這件事?我應該在主視圖控制器上使用類方法,並將頭文件包含在我的設置轉換類中?

+0

我無法弄清楚,讓我來幫助你,你的第一視圖是有UITableView的主視圖嗎?當你在第二個視圖(設置視圖)上做任何更改時,當你點擊第二個視圖中出現的UITableView的任何一行(它是設置視圖?)時,你還需要在MainView中知道(這個更改)?我對嗎 ?? – iPatel

回答

0

您不需要將與您的模型的通信限制爲「主」視圖控制器,您的設置表視圖控制器也可以直接訪問該模型!通過一個地方查看所有模型訪問權限通常不會讓您獲得太多好處,而是要求您發明毫無意義的並行系統,以便將來自該主控制器的模型值傳遞給&。

使模型對象成爲單例,並允許從任何控制器訪問。

但是,如果您確實需要保持架構,則需要通過信號傳回設置視圖正在關閉的主視圖控制器。也許發佈主視圖控制器觀察到的通知,更新後的設置字典可以是通知對象。

+0

我認爲這是我正在尋找的。出於某種原因,當我想到單身時,我的腦海裏出現了這個「紅旗」,所以我從來沒有實現過。我敢肯定,在這種情況下,這將是處理這種問題的最有效的方式 - 尤其是因爲我打算在路上使用相同的模型對象作爲單獨的詳細視圖。現在閱讀單身人士 - 感謝您的幫助! –

+0

你的第一段很棒,但我不明白你爲什麼直接跳到「讓模型對象成爲單身人士」。無需將其設置爲單例 - 只需在創建時將模型傳遞給設置視圖控制器(或任何其他需要它的對象)。 – Caleb

1

我有一個類似的應用程序。在我的設置視圖中,無論何時修改設置,我都會在設置視圖中調用單個對象,以跟蹤設置視圖中的設置。切換回主視圖時,在viewWillAppear方法中,我檢查單例以查看設置的設置並相應地更新我的UI。

1

您可以爲設置創建單例類。 這裏是鏈接怎麼做Care and Feeding of Singletons

假設你的單身人士叫做SharedSettings。 每次您在視圖中更改設置時,都應該在您的SharedSettings單例中更改它們,並告訴視圖應用此更改。爲了「告訴視圖」,objective-c中有兩種最常見的方法:委託和NSNotificationCenter。

這裏是教程代表Example for delegate

這裏是鏈接,通知NSNotificationCenter Tutorial

委託和通知的區別在於該委託被用來通知一類例如如cellForRowAtIndexPath,並且通知用於通知一個通知,例如許多觀察者。假設您有5個視圖控制器,並且在設置中將背景從紅色更改爲綠色,並且您需要通知所有5個視圖來更改其顏色。 通知也被認爲比代表慢一點。

如果您有關於單身人士的問題,代表或通知可以隨意問。

4

與其他答案相反,這裏真的不需要使用單例。您只需要一個在主視圖控制器和設置視圖控制器之間共享的對象,或者以某種方式在它們之間傳遞信息。下面是一些不需要一個新的單例類選項:

  • 共享模式:如果您使用的是模型類,以保持您的設置軌道,無論您的主視圖控制器和設置視圖控制器可以訪問模型,如果你只是告訴他們兩個模型。如果你不:例如,如果您同時創建視圖控制器,當你的應用程序啓動時,您可以創建在同一時間模型,並通過模型兩個控制器:

    MyModel *model = [[MyModel alloc] initWithFilePath:somePath]; 
    MainViewController *mainVC = [[MainViewController alloc] initWithNibName:nil bundle:nil]; 
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil]; 
    mainVC.model = model; 
    settingsVC.model = model;
  • 共享對象需要/需要一個完整的模型類,並且只需要在兩個控制器之間傳遞一些更改,讓他們共享一個簡單的數據容器,就像字典一樣。比方說,例如,主視圖控制器負責創建設置視圖控制器,然後將其推送到導航堆棧上。它可以很容易地說:「這是一個可變的詞典;使用它可以獲得您需要的任何設置,並記錄任何更改。」在主視圖控制器的代碼會是這個樣子:

    self.settings = [NSMutableDictionary dictionary]; 
    // ...code to add all the settings to the dictionary... 
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil]; 
    settingsVC.settings = self.settings; 
    [self.navigationController pushViewController:settingsVC];
  • 代表團:考慮前面的情況,但不是通過一個可變的字典或模型對象設置視圖控制器,通過主視圖控制器本身作爲共享對象。如果設置是主視圖控制器的屬性,則設置視圖控制器可以訪問這些屬性(請使用訪問器)來獲取和設置設置。或者將它翻過來讓主視圖控制器保持對設置視圖控制器的引用,以便它可以詢問它需要的任何設置的值。無論哪種方式,一個視圖控制器充當另一個視圖控制器的助手,這就是委託模式。

  • NSUserDefaults的:共享用戶默認對象是已經單身,所以你並不真的需要一個不同的。兩個視圖控制器都可以簡單地訪問共享用戶的默認對象來獲取/設置他們所需的設置。

無論你選擇哪一個,你要確保你的每個控制器讀取在-viewWillAppear的設置,並根據需要更新UI。

你的問題主要是關於如何讓兩個視圖控制器互相交談。有很多方法可以做到這一點,並且任何人都不需要單身人士。

相關問題