我迷失了代表的使用。 确定它们用于在对象之间传递值,假设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
我应该如何传递数据?
我为此疯狂,我看过许多在线教程,但我仍然无法真正了解如何使用它
答案 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];