我有一个关于Monotouch的问题。
情况:我有2个ViewControllers。第一个(我们称之为VC-A)看起来类似于联系人编辑屏幕,这意味着它有一个包含多个Sections的TableView,每个Sections包含Buttons和TextFields。现在,当用户单击其中一个按钮时,他将进入第二个ViewController(VC-B),它显示包含数据库数据的TableView。当用户点击这些行中的任何一行时,VC-B将被关闭,我想将所选的数据库条目(字符串)显示为首先打开VC-B的按钮(在VC-A中)的标题。
去年我做了一个Objective-C项目时,我设法通过使用代表将数据发回到堆栈中,但我还没有找到一种方法在Monotouch中如何工作。
我在这里已经阅读了几个关于使用AppDelegate或使用单例的问题,但我不确定这是从子视图返回数据的正确方法。
答案 0 :(得分:5)
您可以复制委托模式。将C#委托添加到VC-B,它接受一个参数,一些数据结构。
在VC-B的“ViewWillDisappear
”中,调用委托它不是null并将数据传递给它。
这样,您的调用VC可以访问数据,但您不需要两个控制器之间的紧密耦合。它所要做的就是在VC-B中注册一个委托方法。
由于MonoTouch是.NET4,您可以使用Func<MyDataStructure>
或Action<MyDataStructure>
,而无需使用完全限定的委托类型。
答案 1 :(得分:2)
我有一个静态单例类,用于存储关于我的应用程序的“状态”类型数据 - 当前设置和应用程序中许多不同位置所需的选择。这是解决这个问题的一种方法。
您还可以在创建VC-B时向VC-B传递对VC-A的引用,以便它可以显式访问它的父视图并以这种方式传回值。
答案 2 :(得分:0)
我实际上更喜欢使用TinyMessenger进行跨容器调用我发现当你不想继续引用可能导致内存泄漏的繁重的viewcontrollers时,这非常有用!
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