Objective c 从子视图控制器传回数据

Objective c 从子视图控制器传回数据,objective-c,uicontainerview,childviewcontroller,parentviewcontroller,Objective C,Uicontainerview,Childviewcontroller,Parentviewcontroller,我是一个初学者,我有一个项目,需要从childviewcontroller传回数据。具体地说,我的容器中有一个选择器视图,我希望能够使用它来选择一个选项,比如说,简化一个颜色,以便从十种颜色的数组中选择。然后,我希望能够访问我的父视图控制器中选择的颜色,并对其进行处理。我已经对此进行了几天的研究,在S.O.的一个相关问题中找到了与我所寻找的最接近的答案。这里是: 关于向containerView控制器传递值,您可以在ChildViewController中为希望传递的值创建一个属性。然后在Par

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

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

self.ChildViewController.yourProperty = yourValue
((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;
相反,可以通过4种方式实现:

您可以制定一个代理协议来在控制器之间进行数据通信

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

您可以使用KVO

最简单的方法是,您可以在parentviewController中创建一个属性,并按如下方式访问它:

self.ChildViewController.yourProperty = yourValue
((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
 - (void) myMethod
 {
   [delegate passValue:[UIColor redColor]]; // you pass the value here
 }
ChildViewController * controller = [[ChildViewController alloc]initWithiNibName:@"ChildViewController"];
controller.delegate = self; //without this line the code won't work!
在您的ParentViewController.h上

#import "ChildViewController.h"

@interface ParentViewController : UIViewController <ChildViewControllerDelegate >  // you adopt the protocol
{
}
现在小心点。只有设置委托,所有操作都将正常工作。 因此,当您在ParentViewController类中声明ChildViewController时,请执行以下操作:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject > 

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

@end
 - (void) myMethod
 {
   [delegate passValue:[UIColor redColor]]; // you pass the value here
 }
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 

注:这非常重要

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

@协议---

@结束

进口--


@接口类名--

Hi metronic。谢谢你,这帮了大忙。我已经完成了你所说的一切,我想我理解了其中大部分的逻辑。除了你写的最后一点:关于你的ParentViewController.m:-void passValue:UIColor*这个值{//这里你收到的是从ChildViewController传递过来的颜色}我或多或少了解它背后的想法,但它实际上是如何工作的。假设我在容器中选择了红色。如何使用此方法在父级中访问它?类似于:UIColor*myReceivedColor=[self-passValue:?];否,您将在方法内接收数据-void passValue:UIColor*theValue;在该方法中放置断点以确保其正常工作,您可以如下方式访问它:UIColor*myReceivedColor=theValue;好啊很抱歉。我对在方法中接收值的概念一点也不熟悉。所以,为了确保我理解你。我是否需要在父级中的-void passValue:UIColor*theValue{}方法中写入任何内容?如果我想访问我父母的颜色。。。我试着写一些UIColor*myReceivedColor=theValue;然后返回未声明标识符的用法:theValue。我还尝试了UIColor*myReceivedValue=[self-passValue:theValue];我也尝试过这个[self passValue:[self.controller.colors objectAtIndex:[self.controller.myPickerView selectedRowInComponent:0]];我想我知道它为什么不起作用了。您的行:ChildViewController*controller=[[ChildViewController alloc]initWithiNibName:@ChildViewController];提示错误:ChildViewController没有可见的@interface声明选择器initWithNibName'