0

例を使用してプロトコルとデリゲートを研究しています!この例を再作成しようとすると、この条件が尊重されていないことに気付きます。

if([delegate replysToSelector:@selector(amountEntered :)]){blabla}

間違いはどこにありますか?スクリプト:

ファーストビュー.h

 #import <UIKit/UIKit.h>
 #import "EnterAmountViewController.h"

 @interface DelegateExampleViewController : UIViewController  <EnterAmountDelegate>{

 IBOutlet UILabel *amountLabel;
 }

 -(IBAction)changeAmountPressed;

 @end

ファーストビュー.m

#import "DelegateExampleViewController.h"

@implementation DelegateExampleViewController

-(IBAction)changeAmountPressed
{
EnterAmountViewController * enterAmountVC = [[EnterAmountViewController alloc]init];

enterAmountVC.delegate = self;

} 


-(void)amountEntered:(NSInteger)amount
{
amountLabel.text = [NSString stringWithFormat:@"%i" , amount];
}

@end

セカンドビュー.h

#import <UIKit/UIKit.h>

@protocol EnterAmountDelegate <NSObject>

-(void)amountEntered:(NSInteger)amount;

@end


@interface EnterAmountViewController : UIViewController {

 IBOutlet UITextField *amountTextField;

 id<EnterAmountDelegate> delegate;

 }


-(IBAction)savePressed;

@property(nonatomic,retain) id<EnterAmountDelegate> delegate;

@end

セカンドビュー.m

#import "EnterAmountViewController.h"
#import "DelegateExampleViewController.h"

@implementation EnterAmountViewController

@synthesize delegate;


- (void)viewDidLoad {
[super viewDidLoad];

amountTextField.text = @"";
[amountTextField becomeFirstResponder];

}


-(IBAction)savePressed
{

if([delegate respondsToSelector:@selector(amountEntered:)])
{

    [delegate amountEntered:[amountTextField.text intValue]];
    NSLog(@"rugg");
}

}

@end

前もって感謝します!

4

1 に答える 1

1

メソッドでは:

-(IBAction)changeAmountPressed
{
  EnterAmountViewController * enterAmountVC = [[EnterAmountViewController alloc]init];

  enterAmountVC.delegate = self;
}

EnterAmountViewControllerローカル変数としてスタック上に のインスタンスを作成しています。この変数は、スコープの最後ではアクセスできなくなります。したがって、実行するsavePressedと、設定しなかった別のオブジェクトで実行されdelegateます。

つまり、チェックすると

if([delegate respondsToSelector:@selector(amountEntered:)])

delegatenilなのでNOを返します...

デリゲートを設定する正しい方法は、次のprepareForSegueメカニズムを使用することです。

@implementation DelegateExampleViewController

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

   [(EnterAmountViewController*)segue.destinationViewController setDelegate:self];
}
...

changeAmountPressedメソッドも相対バインディングも必要ありません。

于 2012-10-19T11:45:48.493 に答える