1

与えられた:

  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 {

} @終わり - - - - - - - - - - - - - - - - - - - - - - - - -------

私の目標:buttonClickedアクションでclassAからメソッドデリゲートを呼び出すにはclassBが必要です

質問:目標を達成するために何をすべきか。

4

4 に答える 4

4

同じページにいることを確認するためだけに:)

ClassA代理人がいる場合ClassADelegate。これが意味するのは、で何らかの「イベント」が発生した場合ClassAClassAそのデリゲートを介して他のクラスに「イベント」が発生したことを通知したいということです- ClassBClassAデリゲートを介してこれを行います- 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

これがお役に立てば幸いです:)

于 2012-05-09T16:16:28.250 に答える
2

classAにassignプロパティを追加します。

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

次に、classBのviewDidLoadメソッドで、次を呼び出します。

[myClassAObject setDelegate:self];

次に、クラスAで、次のように呼び出します。

if (_delegate && [_delegate respondsToSelector:@selector(method:)]) {
       [_delegate method:@"string"];
}
于 2012-05-09T15:47:13.397 に答える
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"];
}
于 2012-05-09T15:49:29.963 に答える
0

デリゲートオブジェクトを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];
}
于 2012-05-09T15:48:12.523 に答える