1

2つのUIViewController、GameControllerとRhythmControllerがあります。このようにRhythmController.hでRhythmDelegateを定義しました。RhythmControllerのdoEndGameメソッドは、デリゲートプロトコルを実装するGameControllergameOverのデリゲートメソッドを呼び出すことになっています。

なぜこれが機能しないのか理解できません...私のコードにエラーがありますか?助けてくれてありがとう。

@class RhythmView,RhythmDelegate, RhythmController;

@protocol RhythmDelegate
@required
-(void)gameOver:(RhythmController*)aRhythmController;
@end

@interface RhythmController : UIViewController <UIGestureRecognizerDelegate, UIAlertViewDelegate> {
.....

}

@property (nonatomic, retain) IBOutlet NSObject<RhythmDelegate>* delegate;

RhythmController.m内で、デリゲート呼び出しは次のようになります。

@implementation RhythmController
@synthesize delegate;

-(void)doEndGame{

isPaused = true;
[delegate gameOver:self];
}

doEndGameがブレークポイントを内部として呼び出されていることを確認します。ただし、デリゲートを実装するGameControllerで必要なメソッドには移動しません。

#import <UIKit/UIKit.h>
#import "CoinsController.h"
#import "CoinsGame.h"
#import "HighscoreController.h"
#import "RhythmController.h"
#import "RhythmView.h"

@interface GameController : UIViewController <RhythmDelegate> {

IBOutlet UIView *landscapePlayView;
IBOutlet UIView *landscapeGameHolderView;
IBOutlet UIView *portraitPlayView;
IBOutlet UIView *portraitGameHolderView;
IBOutlet UIView *loadingView;
IBOutlet UIView *welcomeView;
IBOutlet UIButton *continueButton;
IBOutlet UIView *aboutView;
IBOutlet UIView *playView;
IBOutlet UIView *rhythmView;
//IBOutlet UIView *levelSelectView;
IBOutlet UILabel *musicNotation;
IBOutlet CoinsController *coinsController;
IBOutlet RhythmController *rhythmController;


IBOutletCollection(UILabel) NSArray *remainingTurnsLabels;
IBOutletCollection(UILabel) NSArray *scoreLabels;
IBOutlet HighscoreController *highscoreController;

CoinsGame* previousGame;
BOOL isPlayingGame;
}
-(void)setPreviousGame:(CoinsGame*)aCoinsGame;
-(CoinsGame*)currentGame;

- (IBAction)continueGameClicked:(id)sender;
- (IBAction)newGameClicked:(id)sender;
- (IBAction)highScoresClicked:(id)sender;
- (IBAction)aboutClicked:(id)sender;
- (IBAction)aboutDoneClicked:(id)sender;
- (IBAction)highscoreDoneClicked:(id)sender;

-(void)loadImages;
-(void)showPlayView: (UIInterfaceOrientation)interfaceOrientation;
-(void)doPause; 

@end

GameController.mでは、メソッドは次のとおりです。

// RhythmDelegate Tasks
-(void)gameOver:(RhythmController*)aRhythmController{

NSLog(@"Came into gameOver delegated task"); 
[self.view addSubview: welcomeView];
}
4

3 に答える 3

2

ブレークポイントでデリゲート変数がnilであるかどうかを確認します。はいの場合、デリゲートを設定するのを忘れました。

RhythmControllerを作成した後、gamecontrollerのviewdidloadメソッドで簡単に設定できます。

rythmcontroller.delegate = self;
于 2012-08-08T14:58:13.963 に答える
1

GameControllerインスタンスをRhythmControllerのデリゲートとして設定するのを忘れた可能性があります。デリゲートのプロトコルを実装するだけでは、魔法のようにデリゲート接続を確立することはできません。どこかにこのような行が必要です:

myRhythmController.delegate = myGameController;

注:デリゲートは通常、weak参照であるか、assignプロパティです。これは、デリゲートオブジェクトと元のオブジェクト間の保持ループを防ぐためです。

于 2012-08-08T14:58:02.450 に答える
1

rhythmControllerインスタンスのデリゲートプロパティを設定するのを忘れていませんか?

あなたがコードを作成したとしたら、あなたはこのような何かをしたでしょう:

rhythmController = [[RhythmController alloc] init];
rhythemController.delegate = self;
...
[rhythmController release];

ここで、「self」はGameControllerインスタンスです。

于 2012-08-08T14:58:10.623 に答える