2010-08-03 31 views
0

我能够通过将其视图控制器推入导航堆栈,从视图控制器向视图控制器传递一个变量。怎么我会是这样一个例子:在导航堆栈上传递变量? - iPhone

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
controller.myString = stringToPass; 
[self.navigationController pushViewController:controller animated:YES]; 
[controller release]; 

但是,我该怎么办,如果我想回传给一个变量UP导航堆栈?使用popViewControllerAnimated而不是pushViewController不会像我想象的那样传递变量。

我需要能够从它在定义的视图控制器最多访问变量几个弹出。

任何帮助,将不胜感激:)

回答

0

您传递值而不是变量。

视图控制器不应该负责自行弹出。使用Apple的视图控制器(例如UIImagePicker),父视图控制器负责执行弹出操作;父VC也可以获取当前值。 (不完全正确;它可能会在应用键盘自动完成之前访问该值)

或者,如果它是可以全局共享的值,则可以将其存储在应用程序委托中。

+0

谢谢你的帮助:) – Martyn 2010-08-03 21:05:45

0

你可以导航控制器的保持在VC堆栈中使用self.navigationController。您可以拨打一些方法,如

[self.navigationController setMyString:stringToPassUp]; 

还有其他几种方法, self.tabBarController在堆栈中的tabbarcontroller起来,或者最简单的

[self.parentViewController setMyString:stringToPassUp]; 

编辑给出的例子downvotes以上,没有人给出一个更好的解释,让我们讨论的适当的方式来做到这一点。

如果你有一些物体(如您的MyViewController *controller)和对象有件事要告诉你,通常的做法是这样的:

  • MyViewController得到一个delegate属性,类型(id)
  • 视图控制器实例化MyViewController,设置此代理属性,如下所示:
    controller.delegate = self;
  • MyViewController会在有些事情要说时做类似的事情:
    [self.delegate delegateMessage:arg1];以“传递讯息”为准。

要做到这一点很好,你可能想创建自己的@protocol MyViewControllerDelegate,并宣布这将是设置controller.delegate = self;采纳该协议,通过把<MyViewControllerDelegate>在@interface行的类。然后将MyViewController的delegate属性声明为id<MyViewControllerDelegate> delegate;,以便[self.delegate ...]消息可以与协议规范相匹配。

基本上整个Cocoa Touch API都是这样工作的。只要看看如何实现您的互动的想法。

+1

什么是downvotes?! – mvds 2010-08-03 18:00:35

+1

他们不是我的,但我认为他们是因为你正在推销一些不可思议的流量控制思想。 – 2010-08-03 18:47:16

+1

;-)只是回答这个问题... – mvds 2010-08-03 18:51:19