从子视图更新主视图上的IBOutlet

时间:2012-01-29 12:40:38

标签: ios uiviewcontroller addsubview iboutlet

我有一个主视图,上面有一个UISlider。

在主视图中,我使用以下方法添加子视图:

gameView *myViewController = [[gameView alloc] initWithNibName:@"gameView" bundle:nil];
[self.view addSubview:myViewController.view];

子视图在主视图的顶部创建。

当我使用:

删除子视图时
[self.view removeFromSuperview];

下方的主视图变得可见。

我希望能够在调用[self.view removeFromSuperview]

之前从子视图更新主视图上的UISlider的值

有可能吗?

基本上,这个问题可以推广到如何从子视图更新主视图上的IBOutlet。

非常感谢帮助。 非常感谢!

2 个答案:

答案 0 :(得分:0)

是的,这是可能的。

还有几种方法可以做到这一点。以下是我将如何做到这一点:

首先,让您的父视图控制器UISlider成为其他对象可以访问的属性。

其次,为您的gameView对象提供一个您将链接到父视图的实例变量(让我们称之为id savedParent;

然后,在执行removeFromSuperview之前,您可以执行以下操作:

ParentViewController * parentVC = (ParentViewController *) savedParent;
if(parentVC)
{
    // some float value of whatever you want to set the slider value to
    parentVC.slider.value = 0.5f; 
}

另外,如果您只想添加子视图,为什么要实例化整个View Controller对象(gameView)?当您进行removeFromSubview调用时,视图会被移除,但您的gameView视图控制器未被释放(甚至可能会丢失并泄漏到内存中,从而导致崩溃)。如果要进行子视图,则子类UIView。如果要推送新的视图控制器,请按下整个控制器(而不仅仅是它包含的视图)。

答案 1 :(得分:0)

这是另一种方式:

我不确定滑块代表什么,但你需要创建一个代表这个

的对象
@interface MyGameThing : NSObject
@property (assign) CGFloat myValue;
@end 

@implementation MyGameThing {
   CGFloat *_value;
}
@synthesize myValue = _myValue;
@end

然后,您需要将该对象传递给两个视图控制器(或使其成为单例)。

然后,在parentViewController上,在viewWillAppear中,只需将滑块设置为新值。

丹尼尔。

(p.s。不只是将视图控制器视图添加到superview,使用presentModalViewController / dismissModalViewController或导航控制器。)