2012-01-01 17 views
7

まず、少し背景。私はiOS開発の初心者です。私は長い間、.Netの土地にいました。それはおそらく私がこの質問をしている理由でしょうが、ここにはあります。1つのビューコントローラから別のビューコントローラにデータを渡す。 iOS <= 4対iOS 5

基本設定はこれです。 UINavigationControllerにはRootViewControllerMasterViewControllerとします。このMasterViewControllerで何らかのアクションが発生すると、DetailsViewControllerにドリルダウンします。ただし、一部のデータをDetailsViewControllerに渡したいとします。さてしかし、iOSの5で、それはこれが今行われているようです

@implementation MasterViewController 

    -(IBAction)someAction 
    { 
     DetailsViewController *dvc = [[DetailsViewController alloc]initWithNibName:@"DetailsView" bundle:nil]; 
     dvc.someDataProp = [self getSomeDataSomeHow]; 
     [[self navigationController] pushViewController:dvc animated:YES]; 
    } 

@end 

を:

それはSDKの以前のバージョンで(前のiOS 5への)アプローチは、これに似たことが、私の理解でありますストーリーボードとセグを使ってXcodeで、あなたはDetailsViewControllerにMasterViewControllerからセグエを設定し、その後のコードで、あなたがこのような何かを:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    [segue.destinationViewController setSomeDataProp:[self getSomeDataSomeHow]]; 
} 

私の質問は基本的にはこれです:古いアプローチは、何らかの形で私にたくさんのきれいな感じ。 ViewControllerのタイプについては非常に明確です。ナビゲーションスタックにプッシュしていて、プロパティを簡単に設定できます。しかし、新しいアプローチでは、destinationViewControllerはタイプid(明白な理由のため)であり、それは私にはるかに少ない清潔感を感じます。繰り返しますが、これは私の.Net側が出てくる可能性がありますが、iOSではこれが一般的ですか? idを使い、風に注意を払うだけです。

+1

スニペットをコピー&ペーストするのではなく、これがどのように行われているかを尋ねることに対して多くの敬意を払います。私も同様の質問をしていましたが、ここでのいくつかの経験は私の答えです:iOS5では、UIロジックが2つに分かれていることがわかります。1)ViewControllerのライフサイクルと遷移2)データフロー。Storyboardは1を処理し、開発者は2を処理することが期待されます。このようなシナリオでは、これらのキャストが実行されます。私の場合、問題は、この分割が意味をなさないかどうかです。これらの2つの概念を切り離すことはできますか?私はアップルがそうしていると思うし、それがどのように機能するかを見るだろう。 – Guven

答えて

6

ストーリーボードでは、名前付き識別子をセグに割り当てることができます。 セグを選択し、属性インスペクタでセグメント識別子に名前を追加できます。

そして、あなたはこの識別子をチェックする必要がありますので、あなたが明示的に行うことが及びdestinationViewControllerがどうなるかについてであるセグエ知っているprepareForSegue方法インチ多くの場合

​​
+0

良いですが、あなたはまだそこにその醜いキャストを持っています。これが好ましいアプローチですか? – BFree

+0

これが好ましいアプローチです。あなたは正しい、古い方法はより明確で明示的です。新しい方法では、あなたはストーリーボードに「フック」しています。残念ながら、新しい静的で動的なUITableViewデザイナのサポートなど、XIBデザイナには組み込まれていないストーリーボードのみに新しい機能があります。 –

+1

は、このコードスニペットが 'prepareForSegue'メソッド内に挿入されていますか? – chwi

4

、セグエの宛先ビューコントローラがUINavigationViewControllerであってもよく、その場合には、溶液(上記デニス・マシューズ溶液のわずかな変形)は、メッセージ 『topViewController』を使用する必要があります:私は長い間のiOSで作業されていないが、私はあなたが原因でObjective-Cのの緩い結合されたメッセージングシステムのキャストする必要はありませんいくつかの例を見てきました

if ([segue.identifier isEqualToString:@"My First Segue Identifier"]) 
{  
    NavitationViewController* navController = [segue destinationViewController]; 
    DetailsViewController *dvc = (DetailsViewController*) [navController topViewController] 
    // Set the DVC's properties 
} 
+0

これは、 "NavitationViewController * navController"ではなく "UINavigationController * navController"を意味すると思われる場合を除いて、私のためのトリックでした。 – mpemburn

1

代わりにセグエ識別子をチェックしたり、特定のViewControllerにキャストすることで、あなたがこれを行うことができます:最初の行で

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.destinationViewController respondsToSelector: @selector(setCompany:)]) { 
     [segue.destinationViewController performSelector: @selector(setCompany:) withObject: self.company]; 
    } 
} 

destinationViewControllerは、メソッドsetCompanyを持っている場合は、プロパティという名前の会社にこれを持っている場合、私は(頼みます1つはあなたのために生成されるでしょう)。そうであれば、そのメソッドを呼び出す/そのプロパティを2行目のコードで設定することができます。

したがって、この場合には、あなたは本当に先のViewControllerを知っている必要はありませんし、簡単に会社を扱うサポートして別のものに置き換えることもできます。

関連する問題