gpt4 book ai didi

ios - 代表申报困境

转载 作者:行者123 更新时间:2023-12-03 16:49:01 26 4
gpt4 key购买 nike

我很困惑 - 我无法理解委托(delegate)的用途是什么?

默认创建的应用程序委托(delegate)是可以理解的,但在某些情况下我见过这样的东西:

@interface MyClass : UIViewController <UIScrollViewDelegate> {
UIScrollView *scrollView;
UIPageControl *pageControl;
NSMutableArray *viewControllers;
BOOL pageControlUsed;
}

//...

@end

什么是 <UIScrollViewDelegate>为了?

它是如何工作的以及为什么使用它?

最佳答案

<UIScrollViewDelegate>表示该类符合 UIScrollViewDelegate 协议(protocol)

这真正的意思是该类必须实现 UIScrollViewDelegate 中定义的所有必需方法。协议(protocol)。就这么简单。

如果您愿意,您可以使您的类符合多个协议(protocol):

@implementation MyClass : UIViewController <SomeProtocol, SomeOtherProtocol>

使类符合协议(protocol)的目的是 a) 将类型声明为协议(protocol)的一致者,因此您现在可以将此类型分类在 id <SomeProtocol> 下,这对于此类的对象可能属于的委托(delegate)对象来说更好,并且 b) 它告诉编译器不要警告您实现的方法未在头文件中声明,因为您的类符合协议(protocol)。

这是一个例子:

可打印.h

@protocol Printable

- (void) print:(Printer *) printer;

@end

文档.h

#import "Printable.h"
@interface Document : NSObject <Printable> {
//ivars omitted for brevity, there are sure to be many of these :)
}
@end

文档.m

@implementation Document

//probably tons of code here..

#pragma mark Printable methods

- (void) print: (Printer *) printer {
//do awesome print job stuff here...
}

@end

您可以然后拥有多个符合 Printable 的对象协议(protocol),然后可以用作实例变量,例如 PrintJob对象:

@interface PrintJob : NSObject {
id <Printable> target;
Printer *printer;
}

@property (nonatomic, retain) id <Printable> target;

- (id) initWithPrinter:(Printer *) print;
- (void) start;

@end

@implementation PrintJob

@synthesize target;

- (id) initWithPrinter:(Printer *) print andTarget:(id<Printable>) targ {
if((self = [super init])) {
printer = print;
self.target = targ;
}
return self;
}

- (void) start {
[target print:printer]; //invoke print on the target, which we know conforms to Printable
}

- (void) dealloc {
[target release];
[super dealloc];
}
@end

关于ios - 代表申报困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4363823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com