-1

我迷失了使用代表的问题。好的,它们用于在对象之间传递值,假设 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

我应该如何传递数据?

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

4

3 回答 3

2

我认为您对代表的看法仍然有些偏离,如果您希望在视图控制器之间传递数据,那么JuJoDi 的链接就是您想要的。

但是委托可以被视为一种回调,当“子”对象发生某些事情时,可以让“父”对象有机会执行某些代码。

例如 UIScrollView 有一个委托方法scrollViewDidScroll:,告诉它的委托它已经滚动并且可以运行一些代码。大多数情况下,您将scrollView.delegate = self意味着该对象self(通常是您正在编写此语句的视图控制器)正在成为滚动视图的委托,这意味着它将接收来自滚动视图委托方法(它们是在 UIScrollViewDelegate 协议中定义,但除非你想编写自己的委托,否则你不需要担心)。

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

于 2013-07-30T19:11:20.183 回答
1

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

委托通常被声明为类似id <NSWindowDelegate>并实现该协议。

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

于 2013-07-30T19:08:53.387 回答
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];
于 2013-07-30T19:39:39.903 回答