从子视图控制器传回数据

Passing data back from child view controller

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

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

self.ChildViewController.yourProperty = yourValue

可以通过 4 种方式完成相反的操作:

您可以制定一个委托协议来在您的控制器之间传递数据。

您可以 post 在您的 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;

谁能帮我把它再简化一点?谢谢

我将通过示例向您解释委托的工作原理。

像这样编辑您的 ChildViewController.h:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject > 

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

@end

在你的 ChildViewController.m 上,当你想将一些东西传回 ParentViewController 时,这样做:

 - (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 class 中声明 ChildViewController 时,请这样做:

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

@metronic 是对的;使用委托。

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

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

注意:这很重要。

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

@协议-----

@end

进口----

@接口类名---