Как создать делегат в Objective-C?

Пользователь

от maya , в категории: Другие , 2 года назад

Как создать делегат в Objective-C?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от amaya_bahringer , 2 года назад

@maya 

В Objective-C делегаты создаются с помощью протокола (protocol) и свойства (property) с типом id в классе, который будет иметь делегата. Ниже приведен пример создания делегата для класса MyClass:

  1. Создайте протокол, который описывает методы, которые класс-делегат будет реализовывать. Например:


@protocol MyClassDelegate

  • (void)myClassDidFinishTask:(MyClass *)myClass; @end
  1. В классе MyClass объявите свойство делегата и метод, который будет вызывать делегата:


@interface MyClass : NSObject @property (nonatomic, weak) id delegate;

  • (void)startTask; @end


@implementation MyClass

  • (void)startTask { // выполнение задачи // ... // вызов метода делегата, если он реализован if ([self.delegate respondsToSelector:@selector(myClassDidFinishTask:)]) { [self.delegate myClassDidFinishTask:self]; } } @end
  1. Теперь любой объект может стать делегатом MyClass, реализовав соответствующий протокол:


@interface MyDelegate : NSObject @end


@implementation MyDelegate

  • (void)myClassDidFinishTask:(MyClass *)myClass { // обработка завершения задачи } @end
  1. Для того чтобы установить делегата, необходимо просто присвоить объект класса-делегата свойству delegate класса MyClass:


MyClass *myClass = [[MyClass alloc] init]; MyDelegate *myDelegate = [[MyDelegate alloc] init]; myClass.delegate = myDelegate;


Теперь при вызове метода startTask объект MyClass будет вызывать метод делегата myClassDidFinishTask: после завершения задачи.

Пользователь

от loyal , 6 месяцев назад

@maya 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Пример создания делегата в Objective-C

// 1. Создаем протокол, описывающий метод делегата
@protocol MyClassDelegate <NSObject>
- (void)myClassDidFinishTask:(MyClass *)myClass;
@end

// 2. Объявляем класс MyClass с протоколом делегата и методом, вызывающим делегата
@interface MyClass : NSObject
@property (nonatomic, weak) id<MyClassDelegate> delegate;
- (void)startTask;
@end

@implementation MyClass
- (void)startTask {
    // выполнение задачи
    // ...
    // вызов метода делегата, если он реализован
    if ([self.delegate respondsToSelector:@selector(myClassDidFinishTask:)]) {
        [self.delegate myClassDidFinishTask:self];
    }
}
@end

// 3. Реализуем класс, который будет выступать в качестве делегата
@interface MyDelegate : NSObject <MyClassDelegate>
@end

@implementation MyDelegate
- (void)myClassDidFinishTask:(MyClass *)myClass {
    // обработка завершения задачи
}
@end

// 4. Устанавливаем делегата
MyClass *myClass = [[MyClass alloc] init];
MyDelegate *myDelegate = [[MyDelegate alloc] init];
myClass.delegate = myDelegate;

// Теперь при вызове метода startTask объект MyClass будет вызывать метод делегата myClassDidFinishTask: после завершения задачи.