Objective-c代表无法理解如何使用它们

时间:2013-07-30 18:52:16

标签: objective-c class delegates protocols

我迷失了代表的使用。 确定它们用于在对象之间传递值,假设ClassA需要将值传递给ClassB,我们应该使用委托(如果我至少得到它)。

假设我有一个ViewControllerA,它有一个文本字段和一个按钮,以及一个带有标签的ViewControllerB。要将从VControllerA中的文本字段保存的数据传递给VControllerB,我可以使用委托......

让我们看看第一堂课

//ViewControllerA
#import <UIKit/UIKit.h>

@interface ViewControllerA : UIViewController {
IBOutlet UITextField *tf_text;
IBOutlet UIButton *but_add;
}

@property (nonatomic, retain) IBOutlet UITextField *tf_text;
@property (nonatomic, retain) IBOutlet UIButton *but_add;

-(IBAction)addAction:(id)sender;

@end

好的,这是另一个

//ViewControllerB
#import "ViewControllerA.h"

@interface ViewControllerB : ViewController {

IBOutlet UILabel *_label;

}

@property (nonatomic, retain) IBOutlet UILabel *_label;

@end
好吧,现在我开始迷路了。 使用此协议的正确方法是什么?假设我想将其作为新文件 controllerADelegate.h

我应该如何传递数据?

我为此疯狂,我看过许多在线教程,但我仍然无法真正了解如何使用它

3 个答案:

答案 0 :(得分:2)

我认为你对代表来说仍然有点偏离,如果你想在viewcontrollers之间传递数据,那么JuJoDi's link就是你想要的。

但可以将委托视为一种回调,以便在“子”对象中发生某些事情时,为“父”对象提供执行某些代码的机会。

例如,一个UIScrollView有一个委托方法scrollViewDidScroll:,告诉它的委托它已经滚动并可能运行一些代码。大部分时间你会去scrollView.delegate = self,这意味着self对象(通常是你正在编写此语句的视图控制器)正在成为scrollview的委托,这意味着它将接收到从scrollviews委托方法回调(在UIScrollViewDelegate协议中定义,但除非你想编写自己的委托,否则你不必担心)。

希望稍微清除一下,但是简短的委托不仅仅是为了传递数据(即使它们有参数,它们实际上是出于不同的目的),它们用于在某些事情发生时运行代码“父”对象(或类之外的任何东西)可能需要了解的对象

答案 1 :(得分:1)

正如Apple在其IOS tutorial中指出的那样,代表不存在将数据从视图的一部分传递到另一部分,而是让用户在事件发生时做出反应。例如,用户正在编辑某些内容,然后尝试关闭编辑窗口。系统将向窗口的代理发送windowShouldClose:消息。如果代理存在且可以接受该消息,则可以警告用户他有未保存的编辑并询问他是否关闭编辑窗口。

代表通常被声明为类似id <NSWindowDelegate>的东西并实现该协议。

您的控制器应该只传递数据。那只是普通的编程。

答案 2 :(得分:1)

如果要将信息从孩子传递给父母,则使用代理人。在你的情况下,如果ViewControllerA是ViewControllerB的子代,那么你需要一个委托。我不明白为什么你需要把它作为一个新文件来做。 您需要做的只是在您的孩子(ViewControllerA)头文件中执行此操作:

@class ViewControllerA;
@protocol ViewControllerADelegate/*just naming your delegate */ <NSObject>
//list methods that you will be using from your parent ex. -(void)setLabel;

不要忘记在界面中为您的委托设置属性

@property(nonatomic, strong)id delegate;

现在在您的ViewControllerA实现文件中,您需要访问您的父(ViewControllerB)中的方法,您可以在IBAction中执行此操作

-(IBAction)addAction:(id)Sender {
[self.delegate setLabel];

现在将ViewControllerB设置为委托。 在标题中,请确保将您放置在孩子的协议中的方法。还要确保孩子是进口的。

#import "ViewControllerA"

接口之后但在结束之前

-(void)setLabel;

在ViewController B的实现中(最重要的)!

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
ViewControllerA * view = [[[segue destinationViewController] viewControllers] objectAtIndex:0];
[view setDelegate:self];