从子视图控制器

时间:2016-01-23 21:36:24

标签: objective-c uicontainerview childviewcontroller parentviewcontroller

我是初学者,我有一个项目需要从childviewcontroller传回数据。具体来说,我的容器中有一个选择器视图,我希望能够使用它来选择一个选项(比如简化一种颜色,从十种颜色的数组中选择)。然后我希望能够在我的父视图控制器中访问所选颜色并使用它做一些事情。我已经研究了几天了,而且我在S.O.的一个相关问题中找到了我所寻找的最接近的答案。这是:

"关于将值传递给containerView控制器,您可以在ChildViewController中创建一个您想要传递的值的属性。然后在您的ParentViewController中执行以下操作:

self.ChildViewController.yourProperty = yourValue

相反可以用4种方式完成:

您可以制作委托协议以在控制器之间传递数据。

您可以在ChildViewController中发布通知,并将父控制器添加为观察者。

您可以使用KVO。

最简单的方法是,你可以在你的parentviewController中创建一个属性,并像下面那样访问它:"

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;

现在,我想首先尝试第四个选项,因为委托,kvo等是我读过但尚未准备解决的选项。我需要帮助的是最后一个选项。

假设我的子视图控制器中有一个属性,用于存储所选颜色。类似的东西:

@interface ViewController ()

@property NSString *ChosenColorInChildVC;

@end

然后,后来:

self.ChosenColorInChildVC = [self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];

我如何使用建议传递该值:

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;

有人可以为我进一步愚蠢吗?感谢

3 个答案:

答案 0 :(得分:5)

我将以一个代表如何工作的例子向您解释。

像这样编辑你的ChildViewController.h:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject > 

- (void) passValue:(UIColor *) theValue;

@end

如果要将某些内容传递回ParentViewController,请在ChildViewController.m上执行以下操作:

 - (void) myMethod
 {
   [delegate passValue:[UIColor redColor]]; // you pass the value here
 }

在您的ParentViewController.h

#import "ChildViewController.h"

@interface ParentViewController : UIViewController <ChildViewControllerDelegate >  // you adopt the protocol
{
}

在您的ParentViewController.m上:

- (void) passValue:(UIColor *) theValue
   {
      //here you receive the color passed from ChildViewController
   }

现在要小心。只有在设置委托时,一切都会起作用。 因此,当您在ParentViewController类中声明ChildViewController时,请执行以下操作:

ChildViewController * controller = [[ChildViewController alloc]initWithiNibName:@"ChildViewController"];
controller.delegate = self; //without this line the code won't work!

答案 1 :(得分:0)

@metronic是对的;使用委托。

通常,您还会在委托方法中包含发件人:

-(void) childViewController:(ChildViewController*)viewController passValue:(UIColor*) theValue 

答案 2 :(得分:0)

注意:这非常重要。

在#import行上面写协议声明代码,例如

@protocol -----

@end

import ----

@interface classname ---