从子视图控制器传回数据

Pau*_*aul 2 objective-c parentviewcontroller childviewcontroller uicontainerview

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

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

self.ChildViewController.yourProperty = yourValue
Run Code Online (Sandbox Code Playgroud)

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

您可以创建委托协议以在控制器之间传递数据.

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

你可以使用KVO.

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

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
Run Code Online (Sandbox Code Playgroud)

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

假设我的子视图控制器中有一个属性,我存储所选的颜色.就像是:

@interface ViewController ()

@property NSString *ChosenColorInChildVC;

@end
Run Code Online (Sandbox Code Playgroud)

然后,后来:

self.ChosenColorInChildVC = [self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];
Run Code Online (Sandbox Code Playgroud)

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

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

像这样编辑你的ChildViewController.h:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject > 

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

@end
Run Code Online (Sandbox Code Playgroud)

在您的ChildViewController.m上,当您想要将某些内容传递回ParentViewController时,请执行以下操作:

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

在您的ParentViewController.h上

#import "ChildViewController.h"

@interface ParentViewController : UIViewController <ChildViewControllerDelegate >  // you adopt the protocol
{
}
Run Code Online (Sandbox Code Playgroud)

在您的ParentViewController.m上:

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

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

ChildViewController * controller = [[ChildViewController alloc]initWithiNibName:@"ChildViewController"];
controller.delegate = self; //without this line the code won't work!
Run Code Online (Sandbox Code Playgroud)