2016-03-06 27 views
0

假設我有一個具有固定佈局的應用程序:一個按鈕和幾個標籤。因爲我有相同的按鈕和標籤,所以在整個應用程序中不使用多個視圖控制器是有意義的。我不想複製和粘貼它們,因爲它們的外觀和風格永遠不會改變。如果我稍後決定改變它們的外觀,我將不得不經歷每一個視圖控制器,這是一個不好的做法(就像複製和粘貼代碼一樣)。iOS應用程序的結構

雖然,我希望能夠讓用戶回去轉發「佈局」的應用程序,但是這個代碼沒有讓我這樣做:

class MyViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     enterFirstLayout() 
    } 

    func enterFirstLayout() { 
     // do things such as change labels' text property 
     exitFirstLayout() 
    } 

    func exitFirstLayout() { 
     // do things 
     enterSecondLayout() 
    } 

    func enterSecondLayout() { 
     // ... 
    } 
} 

我能做些什麼,以避免產生多個視圖控制器,並讓用戶可以跳過並返回到應用程序的特定佈局?

+1

你應該解耦你的應用程序的固定*佈局*(演示文稿)與*內容*是呈現。您可以只保留一個視圖控制器類,但會使該類的多個實例呈現不同的數據。 – jtbandes

+0

這很有趣,謝謝@jtbandes。如果一個佈局與其他佈局有些不同,會怎麼樣?假設我只需要在一種佈局中調用一個函數,而不是其他函數。 – Cesare

+0

您提出的問題對於很好的答案太模糊。這可能與你的問題不是100%相關,但我會建議探索[ResearchKit](http://researchkit.org/docs/index.html)的設計,該設計有一個「步驟」和「任務」的概念,可能與你正在做的事情有些相似。 – jtbandes

回答

2

我假設你正在試圖實現像嚮導這樣的事情,你可以通過屏幕回到前言。

在這種情況下,我會使用UICollectionViewUICollectionViewFlowLayout。構建一個代表單個「屏幕」佈局的自定義單元,而不是將一個簡單的數據源構建爲一組自定義對象。數據源應該包含所有標籤的內容,例如String變量。

不錯而優雅的代碼。

您可以免費獲得滾動動畫和滑動手勢檢測。如果你喜歡,你可以添加你的自定義幻想動畫。

這是我的解決方案。回到你的問題,如果你想這樣做,你可以例如使用子類。構建基本視圖控制器類,並將所有佈局配置並將標籤公開爲只讀變量,然後繼承此類。請記住,子類化是最緊密的耦合。

其他選項是建立這個視圖控制器一次,並重用不同的數據集。

所以決定是你的。我會在1,3,2順序:)

+0

非常感謝。 'UICollectionView'解決方案看起來很有希望,但是如何在自定義單元之間切換? – Cesare

+0

你會得到免費的滑動手勢。如果你願意,你可以禁用它。要手動觸發切換,您可以使用'setContentOffset(_ contentOffset:CGPoint,animated animated:Bool)'並設置'contentOffset.x = numberOfPage * CGRectGetWidth(self.bounds) – psci