2012-03-08 12 views
2

私は委任の仕組みに従っていると思いますが、here's the tutorial I followedですが、どこかでうんざりしています。私はNSLogに代理人を期待していますが、そうではありません。誰が私が行方不明か間違っているかを知ることができますか?代表団の実装

マイMainViewController.h

@interface MainViewController : UITableViewController <AddClassDelegate> 

MainViewController.m

- (void)cancelAddingClass { 
    NSLog(@"Canceled Yo"); 
} 

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

/* 
When a row is selected, the segue creates the detail view controller as the destination. 
Set the detail view controller's detail item to the item associated with the selected row. 
*/ 
if ([[segue identifier] isEqualToString:@"addClassSegue"]) { 

    UINavigationController *nc = (UINavigationController *)segue.destinationViewController; 
    AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0]; 
    addClassVC.delegate = self; 
} 

マイモーダルビューコントローラAddClassViewController.h

@protocol AddClassDelegate <NSObject> 
- (void)cancelAddingClass; 
@end 

@interface AddClassViewController : UITableViewController 

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

- (IBAction)cancelButtonPressed:(id)sender; 

AddClassViewController.m

@synthesize delegate; 

- (IBAction)cancelButtonPressed:(id)sender { 
    [self.delegate cancelAddingClass]; 
} 

cancelButtonPressed: 

は、ストーリーボードでのモーダルビューの[キャンセル]ボタンにフックアップされています。

+0

これはうまくいくはずです... 'self.delegate cancelAddingClass'の前にNSLogの代理オブジェクトを試してみて、それがnullでないかどうかを確認してください。 – Shubhank

+0

これは良くありません。私の代理人= null。 – tazboy

+0

これはデリゲート宣言の弱い参照のためかもしれないと思います...強いものに変更しよう – Shubhank

答えて

2

コードが正常に表示されています。これは、問題がどこかに見えないことを示しています。私の推測では、ここにある:

AddClassViewController *addClassVC = [segue destinationViewController]; 
addClassVC.delegate = self; 
NSLog(@"segued"); 

あなたはナビゲーションコントローラでのモーダルビューコントローラを埋め込まれたことがありますか?その場合、destinationViewControllerは、AddClassViewControllerではなく、ナビゲーションコントローラを提供します。デバッガでaddClassVCクラスが実際にどのクラスかを確認してください。

ナビゲーションコントローラの場合は問題ありませんが、.viewControllersプロパティを使用して実際のVCにアクセスするだけで済みます。数行それは単純に理解できるようにするには:

UINavigationController *nc = (UINavigationController *)segue.destinationViewController; 
AddClassViewController *addClassVC = (AddClassViewController *)[nc.viewControllers objectAtIndex:0]; 
addClassVC.delegate = self; 

あなたは、より少ない行でそれを行うことができますが、それはデバッグが困難である鋳造とネストされた括弧の混乱、です。

+0

NSLogged addClassVCのクラスとそれはnavcontrollerだと私はそれが私の問題だと思う。私はAddClassViewControllerを試してみました* addClassVC = [[segue destinationViewController] rootViewController];セマンティック問題: 'UIViewController *'型の式で 'AddClassViewController * __ strong'を初期化する互換性のないポインタ型 – tazboy

+0

'UINavigationController *'オブジェクトに 'rootViewController'プロパティが見つからないというエラーが表示されます。あなたは 'topViewController'を意味しましたか?私もtopViewControllerを試みたが、私のアプリはクラッシュした。継続していただきありがとうございます。 – tazboy

+0

おっと、それは私が私の電話でドキュメントをチェックせずに答えるために得るものです...回答更新 – jrturton

-1

すべてが完璧です。私は何の問題も見ていない。どこでもブレークポイントを保持し、デバッグしてください。

+0

私がブレークポイントを投げた場合、私は何を探していますか?私は間違いがない。期待どおりに機能しません。 – tazboy

+0

breakpoinsはアプリケーションエラーに関する情報を提供しません。ブレークポイントを維持すると、尊重されたメソッドが呼び出されるかどうかを確認できます。 – Dee

+0

メソッドが呼び出されているかどうかを確認するだけであれば、NSLogステートメントでは十分ではないでしょうか?ブレークポイントがプログラムの動作などを理解するためにどのように役立つかを見ることができます。私はそれらをもっと試してみるべきです。 – tazboy

0

あなたのメインビューコントローラはリリースされていますか?これにより、弱い参照がnilに設定され、代理人に送信するメッセージは、メッセージnilであるため無視されます。

関連する問題