2012-05-09 2 views
1

Дано:как вызвать метод делегата, iphone

  1. CLASSA с делегатом
  2. ClassB имеет кнопку на нем
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 { 

} @end - -------------------------------------------------- ---

Моя цель: мне нужно ClassB, чтобы вызвать метод делегата от CLASSA в buttonClicked действия

Вопрос: что я должен сделать, чтобы достичь своей цели.

ответ

3

Просто чтобы убедиться, что мы находимся на той же странице :)

Если 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 

Я надеюсь, что это помогает :)

1

Добавить присвойте свойство CLASSA:

@property (nonatomic, assign) id<classADelegate> delegate; 

Затем в методе viewDidLoad для ClassB, звоните:

[myClassAObject setDelegate:self]; 

Тогда в классе А, просто позвоните:

if (_delegate && [_delegate respondsToSelector:@selector(method:)]) { 
     [_delegate method:@"string"]; 
} 
0

Вам необходимо сохранить объект-делегат в классе А:

@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]; 
} 
1

ClassB нуждается в refe до класса 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"]; 
} 
Смежные вопросы