【问题标题】:When I use delegate to pass value to another ViewController,I find the delegate does nothing当我使用委托将值传递给另一个 ViewController 时,我发现委托什么也没做
【发布时间】:2014-04-12 15:13:50
【问题描述】:

当我使用委托将值传递给另一个 ViewController 时,我发现委托什么也没做。 我只是可以删除委托,但我仍然可以传递值!

当我需要将值从 ViewControllerA 传递到 ViewControllerB 时,我只是这样做了,它确实有效!

- (IBAction)sendToB:(id)sender {
ViewControllerB *viewB=[[ViewControllerB alloc]initWithNibName:@"ViewControllerB" bundle:nil];
[viewB getValue:self.textInput.text];
[self presentViewController:viewB animated:YES completion:nil];  }

然后在ViewControllerB,我确实得到了价值。 但这与委托无关,我记得人们都说使用委托在两个ViewControllers 之间传递值。那么有什么区别呢?谢谢!

【问题讨论】:

    标签: ios objective-c cocoa-touch delegates


    【解决方案1】:

    您可以通过多种方式传递值,您展示的一种方式也用于传递值。

    但是假设发生这样一种情况,您必须将值从您提供的 ViewControllerB 更新为 ViewControllerA,那么我确定您不会再次初始化 ViewControllerA,然后尝试传递价值。

    在这种情况下,您将需要 delegate 来执行此操作,您可以通过以下方式使用 protocol 来实现此目的:-

    ViewControllerB.h 文件中创建您的协议

    @protocol sampleDelegate <NSObject>
    - (void)updatedValue:(NSString* )newData;
    @end
    
    @property (nonatomic,assign)id<delegate>delegateObj;
    

    ViewControllerB.m 文件中

    - (IBAction)sendToA:(id)sender 
    {
       [self.delegateObj updatedValue:@"Updated value"];
    }
    

    现在在 ViewControllerA.m 文件中覆盖您的 ViewControllerB's 委托对象:

    - (IBAction)sendToB:(id)sender
    {
        ViewControllerB *viewB=[[ViewControllerB alloc]initWithNibName:@"ViewControllerB" bundle:nil];
        [viewB setDelegate:self];
        [viewB getValue:self.textInput.text];
        [self presentViewController:viewB animated:YES completion:nil];
    }
    
    
    
    //Implement the protocol method here in ViewControllerA.m
    
    - (void)updatedValue:(NSString* )newData
    {
       NSLog(@"Value that updated in ViewControllerB is %@",newData);
    }
    

    希望这有助于您了解代表的重要性。 :)

    【讨论】:

    • 我想知道当我尝试从 VCB 移回 VCA 时,我不需要使用:ViewControllerA *viewA=[ViewControllerA alloc]init]; [self presentViewController:viewA 动画:YES 完成:nil]; ?
    【解决方案2】:

    通常,委托是从 VCB 向 VCA 获取值的一种方式。在这种情况下,VCA 将实现一个委托协议(通常)并将自己作为委托传递给 VCB。然后,当 VCB 具有新值时,它会调用 [delegate update:value] 之类的东西。

    【讨论】:

    • 那么,您的意思是当我们只是将值从 VCA 传递到 VCB 时,我们不需要委托方式?例如,有一个 VCA 的 textField,我在其中输入一些内容,然后按下按钮将 textField 中的文本发送到 VCB,其中传递的值显示在标签中。
    • 正确,因为正如您所见,VCA 已经有了对 VCB 的引用,因为它显式地创建了它,或者因为 segue。但是,除非你做一些特别的事情,否则 VCB 通常不会知道是什么导致它出现。 (因此,委托或通知或独立数据模型。)
    【解决方案3】:

    您的问题似乎暗示您认为当一个 VC 想要将数据传递给另一个时,您必须在每种情况下使用委托。情况并非如此,仅在必要和/或适用且不是唯一方法时才使用委托。

    在您的示例中,如果您想将一个值从 VCB 传递回 VCA,这将是一个可以使用委托的示例。 当 VCB 不知道创建它的对象但它知道它具有传递回该对象的任何值时,您将使用委托。这样一来,VBC 可以由不同类型的对象创建,并且 VCB 总是可以将值传回给它们,而无需对它们一无所知。

    【讨论】:

    • 非常感谢!我想我对此有点清楚了,但还不是完全清楚。
    【解决方案4】:

    委托用于向后传递值。当数据向前传递时,通常使用你的构造。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多