Как вызвать делегат метод, iphone
Дано:
- ClassA со своим делегатом
- У класса В есть кнопка
classA.h
@protocol classADelegate <NSObject>
- (void)method:(NSString *) name;
@end
@interface StoreChooser : UIViewController
@end
------------------------------------------------------
classA.m
-(IBAction)buttonCliked{
// invoke delegate method from classA at here
}
classB.h
@interface classB : UIViewController <classADelegate>
@end
------------------------------------------------------
// Conform delegate of classA
classB.m
- (void)method:(NSString *) name {
} @конец ----------------------------------------------- -------
Моя цель: мне нужно, чтобы classB вызывал делегат метода из classA в действии buttonClicked
Вопрос: что я должен сделать, чтобы достичь своей цели.
4 ответа
Просто чтобы убедиться, что мы находимся на одной странице:)
Если ClassA
имеет делегата ClassADelegate
, Это означает, что когда какое-то "событие" происходит в ClassA
, ClassA
захочет уведомить некоторый другой класс через своего делегата о том, что произошло "событие" - ClassB
, ClassA
сделает это через своего делегата - ClassADelegate
,
Чтобы это произошло, ClassB
придется дать ClassA
знаю, что он будет действовать как ClassA
делегат. ClassB
придется "соответствовать" ClassA
Это протокол, реализующий все методы, перечисленные в протоколе, которые не помечены как @optional.
В коде вы можете сделать это:
// ClassA's delegate
@protocol ClassADelegate <NSObject>
- (void) didDoSomethingCool:(NSString *) name;
@end
// ClassA definition
@interface ClassA
// We'll use this property to call the delegate.
// id<XXX> means that which ever class is assigned to id MUST conform to XXX
@property (nonatomic, assign) id<ClassADelegate> classADelegate;
- (void) doSomething;
@end
// Class A implementation
@implementation ClassA
@synthesize classADelegate;
- (void) doSomething
{
// Do cool things here.
// Now call delegate, in this example, this will be ClassB
[classADelegate didDoSomethingCool:@"Hello from Class A"];
}
Теперь нам нужно подключиться ClassB
чтобы можно было уведомить, что что-то случилось в ClassA
:
// ClassB definition
@interface ClassB<ClassADelegate>
// ClassB<ClassADelegate> lets the compiler know that ClassB is required to have all the
// non-optional method that are listed in ClassADelegate. In short, we say that
// ClassB conforms to the ClassADelegate.
{
ClassA *_classA;
}
@end
Сейчас где-то в ClassB
В файле реализации у нас есть следующее.
// ClassB implementation
@implementation ClassB
- (id) init
{
self = [super init];
if(self)
{
// Just quickly creating an instance of ClassA.
_classA = [ClassA new];
// This is were we tell ClassA that ClassB is its delegate.
_classA.classADelegate = self;
}
return self;
}
- (void) dealloc
{
[_classA release];
[super dealloc];
}
- (void) didDoSomethingCool:(NSString *) name
{
// This is the method that ClassA will be calling via the
// [classADelegate didDoSomethingCool:@"Hello from Class A"] method call.
}
@end
Надеюсь, это поможет:)
Добавьте свойство назначения в classA:
@property (nonatomic, assign) id<classADelegate> delegate;
Затем в методе viewDidLoad для classB вызовите:
[myClassAObject setDelegate:self];
Тогда в классе А просто позвоните:
if (_delegate && [_delegate respondsToSelector:@selector(method:)]) {
[_delegate method:@"string"];
}
ClassB нужна ссылка на ClassA. Этот код не является полным, но он должен помочь вам понять отношения, которые вам нужно создать.
classB.h
@interface classB: UIViewController <classADelegate>
@property (weak, nonatomic) id<classADelegate> delegate;
@end
classB.m
-(id)init {
self = [super init];
if (self) {
self.delegate = [[classADelegate alloc] init];
}
}
-(IBAction)buttonClicked {
[delegate method:@"name"];
}
Вам необходимо сохранить объект делегата в классе A:
@interface classA : NSObject
{
id<classADelegate> _delegate;
}
@property (nonatomic, assign, readwrite) id<classADelegate> delegate;
И синтезируем свойство:
@implementation classA
...
@synthesize delegate = _delegate;
И затем в методе, который должен вызвать делегат, вам нужно проверить объект делегата и метод действителен:
- (void)somethingHappened
{
if ([_delegate respondsToSelector:@selector(method:)])
{
[_delegate method:@"Andy"];
}
}
И, наконец, соответствуют протоколу делегата в классе B:
@implementation classB
...
- (void)method:(NSString *)name
{
[self buttonCliked:nil];
}