我在故事板中設置了此UIViewController,並具有所需的所有插座,視圖和約束條件。完善。我們稱之爲WatchStateController,它將作爲一個抽象的父類。如何在運行時更改UIStoryboard中的UIViewController類名稱
然後我有WatchStateController的這個子類,名爲WatchStateTimeController,它將具有我需要的應用程序的特定狀態的功能。
因爲我試圖在UIStoryboard中使用1視圖控制器,所以在將WatchStateTimeController實例化爲類型WatchStateTimeController時遇到了一些問題 - 它實例化爲WatchStateController。
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
WatchStateTimeController *timeController = (WatchStateTimeController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"WatchStateController"];
這是因爲在故事板的身份檢查器中的「類」字段設置爲「WatchStateController」。所以問題是,我怎樣才能在運行時更改Identity Inspector中設置的此類名?
注:忽略爲什麼我試圖做到這一點,集中精力如何。如果你真的必須知道爲什麼,你可以閱讀戰略設計模式。
考慮更改對策略設計模式的解釋以更好地適應與Storyboard一起提供的應用程序的結構的可能性:不要使用繼承來更改視圖控制器的行爲,請使用聚合。換句話說,在'WatchStateController'上有一個屬性,引用某個基類或協議類型的另一個對象,它可以提供所需的行爲作爲一種委託。 –
謝謝。我對聚合和構圖非常熟悉 - 我在95%的時間使用它。不幸的是,在這裏使用它是沒有意義的,它會導致重複的工作,複製和粘貼相同的代碼,這正是我想要避免的。冗餘是敵人。 如果這是使用故事板的限制,那麼您是對的,必須找到該模式的變體。問題是,在使用故事板時,狀態/策略模式是否完全兼容?或者我應該放棄並用一堆IF/ELSE語句代替代碼(策略模式的實際設計是爲了避免) – PostCodeism
也許我讀錯了或速度很快,但是包含故事板的圖像顯示watchstatecontroller,而您想要改變它...不應該是WatchStateTimeController,因爲你是子類,這是你想要的子類的視圖?也許我可以使用一個更簡單的描述..就像你有一個A級的觀點A和你subclass的A級的B級的觀點B,但你的問題是視圖B是與類A跑? – rezand