2017-05-06 72 views
1

在我的應用程序中,我有這個視圖控制器,用戶輸入信息來創建一個對象非常多。在這個視圖的頂部,我有一個標籤欄,在底部有一個用戶點擊的按鈕來創建/保存對象。在這兩個視圖之間,我有一些元素,例如用戶輸入對象信息的文本字段,標籤和其他一些元素(基本上是對象的一種形式)。iOS故事板滾動視圖內容全景

我現在試圖支持橫向模式以及向此視圖控制器添加更多的表單。問題出現在較小的設備和橫向上,所有的表單元素和文本字段等都不適合。

我想使用滾動視圖來解決這個問題。我使用this Stack Overflow answer來獲取測試項目中的滾動視圖(在將概念移植到我的實際項目之前)。

唯一的麻煩是如果我不能使用該方法將按鈕固定到屏幕的底部。爲了解決這個問題,我在主視圖控制器(視圖控制器A)內創建了一個容器視圖。該容器視圖映射到容納滾動視圖和內容的視圖控制器(視圖控制器B)。然後在視圖控制器A中的容器視圖的正下方,我可以添加創建/保存按鈕。從設計的角度來看,這似乎是完美的。但現在內容與創建/保存按鈕位於不同的視圖控制器中,我實際上無法從用戶輸入文本字段中獲取內容和輸入。

處理這種情況的最佳方法是什麼?在這裏使用容器視圖真的是最好的方法嗎?有沒有簡單的方法將這些輸入從文本字段映射回主視圖控制器?

如果可能,我想盡可能多地保留故事板中的設計工作。在Swift中添加視圖和設計元素將是最後的手段。但我很確定我需要使用某種類型的代碼來將數據返回到主視圖控制器,這完全可以。

+0

據我所知,B是A的子視圖控制器嗎?如果這是正確的,你可否告訴我,如果你是在你的代碼中添加它作爲一個孩子? –

+0

@AndriyGordiychuk我有我正常的默認視圖控制器(視圖控制器A)。然後,我將容器視圖拖到該默認視圖控制器上。它在視圖控制器A內部創建了一個視圖,並創建了一個新的視圖控制器(視圖控制器B)。這一切都在故事板中完成,根本沒有任何代碼。在視圖控制器B的內部,我有滾動視圖和內容以及所有這些。內部視圖控制器A我只有容器視圖(鏈接到視圖控制器B,通過一些嵌入segue或類似的東西)和一個創建/保存按鈕在底部。 –

+0

@AndriyGordiychuk讓我知道,如果這沒有意義。 –

回答

1

爲你實現你想要的行爲,最簡單的方法是:爲這是你在IB創建嵌入SEGUE

1)指定自定義標識符。例如, 「embedViewControllerB」

2)鑑於控制器A添加以下參數:

weak var viewControllerB: ViewControllerB? 

3)鑑於控制器A倍率prepare(for segue:)功能。檢查SEGUE是你嵌入一個如果是這樣,存儲參考B控制:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "embedViewControllerB" { 
     self.viewControllerB = segue.destination as! ViewControllerB 
    } 
} 

現在,當你點擊這個按鈕,你可以通過viewControllerB?屬性訪問視圖控制器B的內容。

在這個階段,由您決定如何繼續。您可以將IBOutlets設置爲B中的文本視圖並在A中讀取它們的內容,也可以在B中實現一些函數以返回必要的數據(可能是元組?)。

希望這會有所幫助

+0

非常抱歉,我花了很長時間回覆。花了更長的時間來實現,然後我想。因此,不是'segue.destinationController',我不得不將其重命名爲'segue.destination',以便將來的觀衆知道(在Swift 3中)。我在嘗試訪問視圖控制器A中的變量時也出現錯誤:類型爲'UIViewController'的值?沒有成員'textField''。有任何想法嗎? –

+0

你需要'@IBAction var textField:UITextField!'訪問它。否則,顯然,你不能訪問它:) –

+0

我在視圖控制器B中有'@IBOutlet var textField:UITextField!'。 –