【问题标题】:Passing data back from child view controller从子视图控制器传回数据
【发布时间】:2016-01-23 21:36:23
【问题描述】:

我是初学者,我有一个项目需要从 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;

有人能帮我把它更简单一点吗?谢谢

【问题讨论】:

    标签: objective-c uicontainerview childviewcontroller parentviewcontroller


    【解决方案1】:

    我将通过一个示例向您解释委托是如何工作的。

    像这样编辑您的 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 类中声明 ChildViewController 时,请这样做:

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

    【讨论】:

    • 嗨 metronic。谢谢你,这是一个巨大的帮助。我已经完成了你所说的一切,并且(我认为)理解了其中大部分背后的逻辑。除了你写的最后一点:“在你的 ParentViewController.m: -(void) passValue:(UIColor *) theValue { //here you receive the color pass from ChildViewController}” 我或多或少理解它背后的想法,但是它在实践中是如何工作的。假设我在容器中选择了红色。我将如何使用这种方法在我的父母中访问它?类似于: UIColor *myReceivedColor = [self passValue:???];
    • 不,您将在方法内收到数据 - (void) passValue:(UIColor *) theValue;在该方法中放置一个断点以确保它正常工作,您可以像这样访问它: UIColor *myReceivedColor = theValue;
    • 好的。为此事道歉。我对方法中“接收值”的概念一点也不熟悉。所以,为了确保我理解你。我是否需要在我的 Parent 的方法 -(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”
    【解决方案2】:

    @metronic 是对的;使用委托。

    通常你也会在你的委托方法中包含发送者:

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

    【讨论】:

      【解决方案3】:

      注意:这非常重要。

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

      @protocol -----

      @结束

      进口----

      @interface 类名---

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 2014-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多