2011-09-20 52 views
2

我有一個關於Monotouch的問題。Monotouch:將數據發回堆棧到另一個ViewController

情況:我有2個ViewControllers。第一個(我們稱之爲VC-A)看起來與聯繫人編輯屏幕相似,這意味着它有一個帶有多個部分的TableView,每個部分都包含Buttons和TextFields。現在,當用戶點擊其中一個按鈕時,他將到達第二個ViewController(VC-B),它顯示一個包含數據庫數據的TableView。當用戶點擊任何這些行時,VC-B將被關閉,並且我想要顯示所選數據庫條目(字符串)作爲首先打開VC-B的按鈕的標題(在VC-A中)。

去年我做了一個Objective-C項目時,我設法使用委託將數據發送回棧中,但是我還沒有找到MonoTouch中的工作方式。

我已經閱讀了幾個有關使用AppDelegate或使用單例的問題,但我不確定這是從子視圖返回數據的正確方法。

回答

5

您可以複製委託模式。向您的VC-B添加一個C#委託,該委託需要一個參數,一些數據結構。 在VC-B的「ViewWillDisappear」中,調用委託,它不爲空並將數據傳遞給它。 通過這種方式,您的呼叫VC可以訪問數據,但不需要兩個控制器之間的緊密耦合。它所要做的就是在VC-B中註冊一個委託方法。

由於MonoTouch是.NET4,因此您可以使用Func<MyDataStructure>Action<MyDataStructure>並且不需要使用完全限定的委託類型。

+0

Thx,我會明天嘗試這個 – banzai86

+0

只是不要混淆蘋果公司/ MVC代表模式與C#代表。 – Krumelur

+0

它再次工作thx – banzai86

2

我有一個靜態單例類,用於存儲有關我的應用程序的「狀態」類型數據 - 應用程序中許多不同位置所需的當前設置和選擇。這是解決這個問題的一種方法。

當您創建VC-B時,您還可以將VC-B的引用傳遞給VC-A,以便它可以顯式訪問其父視圖並以這種方式傳回值。

+0

我不知道如果我使用你的相同的 「方法」。我有一個靜態類,我有一個對象列表。我將「名稱」傳遞給我的「DetailsView」,並在構造函數中使用Linq的.FIND返回具有該「名稱」的對象。不知道如果這是一個可怕的想法或不lol –

0

我實際上更喜歡使用TinyMessenger進行跨容器調用。當您不想保留對可能導致內存泄漏的大量視圖控制器的引用時,我發現這非常有用!

var messageHub = new TinyMessengerHub(); 
// Publishing a message is as simple as calling the "Publish" method. 
messageHub.Publish(new MyMessage()); 

// We can also publish asyncronously if necessary 
messageHub.PublishAsync(new MyMessage()); 

// And we can get a callback when publishing is completed 
messageHub.PublishAsync(new MyMessage(), MyCallback); 
// MyCallback is executed on completion 

https://github.com/grumpydev/TinyMessenger

相關問題