2012-05-09 40 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将通过其代表通知其他代表发生“事件” - ClassBClassA将通过其代表 - 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:在viewDidLoad方法为CLASSB然后

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

,请致电:

[myClassAObject setDelegate:self]; 

然后在A类,只要致电:

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

您需要将代表对象存储在classA中:

@interface classA : NSObject 
{ 
    id<classADelegate> _delegate; 
} 

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

和综合属性:

@implementation classA 
... 

@synthesize delegate = _delegate; 

然后在需要调用这个代表的方法,你需要测试的委托对象和方法是有效的:

​​

最后符合B级代表协议:

@implementation classB 
... 

- (void)method:(NSString *)name 
{ 
    [self buttonCliked:nil]; 
} 
1

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"]; 
}