К делегатам немного сложно привыкнуть, но я думаю, что это лучшая практика, и, подобно Apple, они просто работают .
Я всегда использую формальное объявление протокола. Это немного более логично, на мой взгляд, и очень ясно в коде. Я предлагаю использовать UIView, чтобы изменить ваши параметры вместо контроллера. Я всегда использую один основной контроллер и имею множество подклассов UIViews, которыми может управлять один контроллер. (Однако вы можете изменить следующий код для контроллера, , если вам действительно нужен контроллер вместо обычного представления . ) В файле заголовка дочернего представления, сделайте так:
// ChildView.h
#import <UIKit/UIKit.h>
@protocol ChildViewDelegate; // tells the compiler that there will be a protocol definition later
@interface ChildViewController : UIView {
id <ChildViewDelegate> delegate;
// more stuff
}
// properties and class/instance methods
@end
@protocol ChildViewDelegate // this is the formal definition
- (void)childView:(ChildView *)c willDismissWithButtonIndex:(NSInteger)i; // change the part after (ChildView *)c to reflect the chosen options
@end
Метод между @protocol
и вторым @end
может быть вызван где-нибудь в реализации ChildView, и тогда ваш корневой контроллер представления может быть делегатом, который получает «уведомление».
Файл .m должен выглядеть следующим образом:
// ChildView.m
#import "ChildView.h"
@implementation ChildView
- (id)initWithDelegate:(id<ChildViewDelegate>)del { // make this whatever you want
if (self = [super initWithFrame:CGRect(0, 0, 50, 50)]) { // if frame is a parameter for the init method, you can make that here, your choice
delegate = del; // this defines what class listens to the 'notification'
}
return self;
}
// other methods
// example: a method that will remove the subview
- (void)dismiss {
// tell the delegate (listener) that you're about to dismiss this view
[delegate childView:self willDismissWithButtonIndex:3];
[self removeFromSuperView];
}
@end
Тогда файл .h контроллера корневого представления будет содержать следующий код:
// RootViewController.h
#import "ChildView.h"
@interface RootViewController : UIViewController <ChildViewDelegate> {
// stuff
}
// stuff
@end
И файл реализации будет реализовывать метод, определенный в протоколе в ChildView.h, потому что он будет запускаться, когда ChildView вызывает его запуск. В этом методе укажите, что происходит, когда вы получаете уведомление.