2014-07-07 86 views
2

我有一個簡單的「鑽入」模式的應用程序。我以地圖模式或列表模式呈現項目列表。點擊一個潛入更詳細的「編輯」視圖控制器。我的編輯控制器具有從segue初始化目標視圖控制器狀態的正確方法?

@property (assign, nonatomic) BOOL showMap; 

而在代碼實現的setter/getter方法:

#pragma mark - Properties 
- (BOOL) showMap { 
    return self.viewModeSegments.selectedSegmentIndex == 1; 
} 

- (void) setShowMap: (BOOL) showMap { 
    self.view; // had to add this, it's a hack 
    self.viewModeSegments.selectedSegmentIndex = showMap ? 1 : 0; 
} 

我與啓動控制器設置該屬性:

#pragma mark - Navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString: @"ValveEditSegue"]) { 
     ValveEditController* controller = segue.destinationViewController; 
     controller.valve = self.selections.anyObject; 
     controller.showMap = ShowMap; 
    } 
} 

我發現了什麼,是showMap setter發生在view已填充之前,因此viewModeSegments仍然是nil。我試着用setter中顯示的黑客進行實驗,強制訪問self.view以確保它已加載。但是這似乎是一個糟糕的主意。我不知道的是,我用應該用來代替。

我可以使showMap一個正常的財產與支持,然後鏡像在viewDidLoad時間狀態到小工具,但似乎傻有一個屬性/狀態只是像效果一次蹦牀。

回答

2

這是真正的另一個選項...

根本的問題是,你正在使用的視圖(或子視圖)作爲真的不應該被用於知識的容器。一種觀點是爲了展示知識,而不是擁有這些知識。

更廣泛地說,濫用視圖和它們提供的屬性(例如視圖tag),單元格選擇狀態等常常具有吸引力,因爲它似乎簡單且浪費地將該信息「另外」存儲在其他地方 - 但這樣做並不正確。

控制器有責任維護有關顯示內容的狀態信息,因此應將該信息存儲在控制器的屬性中並將其保存在那裏(用於更新視圖,而不是查詢關於其狀態的視圖)。

1

我想你完全瞭解這個問題。你可能會迫使來自VC的prepareForSegue在視圖負荷減少哈克岬一點點......

(void)controller.view; 

但我想答案你應該採取的是你自己的,使用普通的屬性。我不認爲這很愚蠢,因爲雙模式vc的默認模式是合法的屬性。 (想起UIViewController -hidesBottomBarWhenPushed

相關問題