簡體   English   中英

如何調用代理方法,iPhone

[英]how to call delegate method, 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 {

} @結束 - - - - - - - - - - - - - - - - - - - - - - - - -------

我的目標:我需要classB在buttonClicked動作中從classA調用方法委托

問題 :我應該怎么做才能實現自己的目標。

只是為了確保我們在同一頁面上:)

如果ClassA具有委托ClassADelegate 這意味着當ClassA發生某個“事件”時, ClassA將要通過其委托通知其他某些類“事件”發生了ClassB ClassA將通過其委托ClassADelegate進行此ClassADelegate

為此, ClassB必須讓ClassA知道它將充當ClassA的委托。 通過實施協議中列出的未標記為@optional的所有方法, ClassB必須“符合” ClassA的協議。

在代碼中,您可以這樣做:

// 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; 

然后在classB的viewDidLoad方法中,調用:

[myClassAObject setDelegate:self];

然后在A類中,只需調用:

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

ClassB需要對ClassA的引用。 該代碼雖然不完整,但是應該可以幫助您了解需要創建的關系。

B類

@interface classB: UIViewController <classADelegate>

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

@end

班級

-(id)init {
    self = [super init];
    if (self) {
        self.delegate = [[classADelegate alloc] init];
    }
}

-(IBAction)buttonClicked {
    [delegate method:@"name"];
}

您需要將委托對象存儲在classA中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM