2012-03-08 6 views
0

私はストーリーボードに関するfollowing tutorialを読んでいます。Xcode(ストーリーボードとセグ):なぜリファレンスではなく代理人ですか?

基本的に、このチュートリアルで作成したサンプルアプリケーションを使用すると、さまざまなビューをナビゲートできます。segueを使用して作成されます。

まずコントローラ:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"AddPlayer"]) 
    { 
     UINavigationController *navigationController = segue.destinationViewController; 
     PlayerDetailsViewController *playerDetailsViewController = [[navigationController viewControllers] objectAtIndex:0]; 
     playerDetailsViewController.delegate = self; 
    } 
} 

第二コントローラ:

デリゲートを指定するには、一方から他方へ「行く」とき

ビュー間のチュートリアルをナビゲートするために

は2のUITableViewControllerを作成するために言うと、
@protocol PlayerDetailsViewControllerDelegate <NSObject> 

- (void)playerDetailsViewControllerDidCancel: (PlayerDetailsViewController *)controller; 
- (void)playerDetailsViewController: (PlayerDetailsViewController *)controller didAddPlayer:(Player *)player; 

@end 

@interface PlayerDetailsViewController : UITableViewController 

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

"帰る":

- (IBAction)cancel:(id)sender 
{ 
    [self.delegate playerDetailsViewControllerDidCancel:self]; 
} 



私の単純な質問はなぜこの合併症ですか?デリゲートとプロトコルを使う理由

"Java"スタイルを使用してコードを変更しましたが、今度は2番目のコントローラに渡して、最初のコントローラへの参照を渡しています。すべてが機能しています。

まずコントローラ:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
... 
     playerDetailsViewController.playerViewController = self; 
} 

第二コントローラ:

だから、
@property (strong, readwrite) PlayerViewController *playerViewController; 

、代わりに単にViewControllers間の参照を渡すのデリゲートを使用するメリットは何ですか?

ありがとうございます!あなたは、単一のクラスに関連付けられている強いタイプを使用する場合

グイド

答えて

0

は、Javaの方式で配置するには。 代わりに、デリゲートは最終的にクラスがプロトコルに準拠しています。 @protocolに準拠している限り、多くのクラスをdelegateとしてplayerDetailに渡すことができます。

javaの具体的なクラスの代わりに、キャスティングとパッシングのインターフェイスのようなものです。 あなたは、ListインターフェースとすべてのArrayList、LinkedList ...などの具体的な実装をよく知っているかもしれません。

私が理解できないことの1つは、ナビゲーションを通過することによって目的地コントローラを得る理由です。私はいつもあなたがナビゲーションコントローラを持たない多くの状況で使用できるように、

MyDestinationViewController *dvc = [segue destinationViewController]; 

を使用しました。

+0

ありがとうございます! –

1

いくつかの理由:

  • As Leonardo says、不必要に2つのビューコントローラの参照にあなたのカップルを一緒に使用しました。クラス全体ではなく、必要なデータだけを渡す必要があります
  • これはObjective-Cアプリケーションの構築方法です。別の方法を使用すると、経験豊富な開発者がアプリケーションを理解しにくくすることができます
  • (表示クラスの場合は必ずしもデリゲートが必要なわけではありません。複雑な場合も多い)

最後の点に関連して、コードはすでに必要以上に難しいです。 UIStoryboardSegueには、ソースビューコントローラと宛先ビューコントローラを指すプロパティがあります。ナビゲーションコントローラを混乱させる必要はありません。

+0

最後の点 - 宛先VCが(現在のコントローラと同じナビゲーションスタック内にあるのとは対照的に)ナビゲーションコントローラに埋め込まれている場合、そのすべての混乱が必要です。 – jrturton

+0

@jrturtonはい、そうです。私は最初にコードを誤解しました。それでも、提示されるコードは最も一般的なケース(私は思う)よりも複雑です。 –

+0

答えをありがとう! –