2012-03-25 21 views
1

私はUIViewサブクラスからメソッドを呼び出すことに完全に拘束されていますが、メソッドはちょうど解雇されません、私は何か間違っている気がしますが、何か手がかりを見つけることはありません。トンデリゲートメソッドが呼び出されない

を想定しているTouchView.hファイルは、iPadMainViewController.hは

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

@interface iPadMainViewController : UIViewController <TouchViewDelegate> 

@property (retain) UIWebView *detailsView; 

@end 

及び方法ここで

- (void)MethodNameToCallBack:(NSString *)s 
{ 
    NSLog(@"%@",s); 
} 

を保持しているiPadMainViewController.hファイルを、ファイルの事前ここ

であなたをだありがとう

@protocol TouchViewDelegate 
- (void)MethodNameToCallBack:(NSString *)s; 
@end 

@interface TouchView : UIView { 
    id<TouchViewDelegate> delegate; 
} 

@property (nonatomic, assign) id delegate; 

@end 

ここでは、methを呼び出すと思われるTouchView.mファイルがありますその代理人の代理人

@implementation TouchView 
@synthesize delegate; 


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"HELLO FROM INSIDE"); 

    [[self delegate] MethodNameToCallBack:(NSString *)@"HELLO FROM OUTSIDE"]; 
} 

@end 

答えて

3

デリゲートを合成するだけでは、ゲッターとセッターメソッドが作成されるだけでは不十分です。 iPadMainViewControllerのインスタンスは作成されません。

したがって、TouchViewのインスタンスを作成した後、iPadMainViewControllerのインスタンスを代理人として割り当てる必要があります。

iPadMainViewController *controller = [[iPadMainViewController alloc] init... 
// ... 
TouchView *touchView = [[TouchView alloc] init... 
// ... 
touchView.delegate = controller; 

それともiPadMainViewControllerのviewDidLoadメソッドで:

- (void)viewDidLoad 
{ 
    // ... 
    self.touchView.delegate = self; 
} 
+0

私が見つけた例のどれにも言及しなかったのだろうか、多くのありがとう! – Alexidze

+0

なぜ新しいiPadMainViewControllerを作成するのですか?確かにTouchViewは既存のiPadMainViewControllerのビューに含まれるビューですか? – jrturton

0

Check TouchViewインスタンスをインスタンス化した後で、代理人を割り当てましたか?

0

さらに少しデバッグのためのあなたのtouchesBegan実装を強化:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"HELLO FROM INSIDE"); 
    NSLog(@"our delegate is set towards: %@", delegate); 
    ... 
} 

それは、第2のロギング文で便利な何かをログに記録していますか?

nilと表示されていますが、それが問題の根本原因になります。デリゲートを割り当てるのを忘れました。