2012-01-26 4 views
4

IOSとObjective-Cの新機能、そしてMVCのパラダイム全体です。多くの方法でデータを渡したり共有したりできます。ビューコントローラ

私は(レプリカ)連絡先アプリで働いています。アプリ内でビルドすることもできます。私は別のビューコントローラを介してデータを渡したいとデータがパス(ヌル):(ある。

私の質問は、私は別のビューからのデータを転送するにはどうすればよいです?

答えて

2

ほとんどの回答があるので、コントローラ間でデータをやりとりすることは、あるコントローラから別のコントローラに変数を割り当てることを意味します。 連絡先を一覧表示するコントローラーが1つあり、連絡先の詳細を表示するコントローラーが1つあり、フローが一覧から始まり、連絡先を選択した後に詳細が表示される場合は、連絡先変数を割り当てることができますあなたのリストに表示されます)、それを表示する直前に詳細ビューコントローラに割り当てます。一方

- (void)goToDetailViewControllerForContact:(Contact *)c 
{ 
    ContactDetailViewController *detailVC = [[[ContactDetailViewController alloc] init] autorelease]; 
    detailVC.contact = c; 
    [self.navigationController pushViewController:c animated:YES]; 
    //[self presentModalViewController:detailVC animated:YES]; //in case you don't have a navigation controller 
} 

リストコントローラに詳細コントローラから新しい連絡先を挿入したい場合は、私は最善のアプローチは、そう、細部の1への委譲としてリストコントローラを割り当てることであろうと思います連絡先が追加されると、代理人に通知が送信され、期待どおりに動作します(連絡先をアレイに挿入してテーブルビューを再ロードしますか?)。

@protocol ContactDelegate <NSObject> 
- (void)contactWasCreated:(Contact *)c; 
// - (void)contactWasDeleted:(Contact *)c; //may be useful too... 
@end 

@interface ContactListViewController : UIViewController <ContactDelegate> 
@property (nonatomic, retain) NSArray *contacts; 
... 
@end 

@implementation ContactListViewController 
@synthesize contacts; 
... 

- (void)goToDetailViewControllerForContact:(Contact *)c 
{ 
    ContactDetailViewController *detailVC = [[[ContactDetailViewController alloc] init] autorelease]; 
    detailVC.contact = c; 
    detailVC.delegate = self; 
    [self.navigationController pushViewController:c animated:YES]; 
    //[self presentModalViewController:detailVC animated:YES]; //in case you don't have a navigation controller 
    } 

- (void)contactWasCreated:(Contact *)c 
{ 
    self.contacts = [self.contacts arrayByAddingObject:c]; //I'm not sure this is the correct method signature... 
    [self reloadContacts]; //may be [self.tableView reloadData]; 

} 

... 
@end 


@interface ContactDetailViewController : UIViewController 

@property (nonatomic, assign) id<ContactDelegate> delegate; 
... 
@end 


@implementation ContactDetailViewController 
@synthesize delegate; //remember to don't release it on dealloc as it is an assigned property 
... 

- (void)createContactAction 
{ 
    Contact *c = [[[Contact alloc] init] autorelease]; 
    [c configure]; 
    [self.delegate contactWasCreated:c]; 
} 

... 
@end 
+1

ありがとうRicardPérez:) –

2

技術的には、あなたはいけません!
データに何が起こるかを制御するための「ビュー」ではありません。

あなたがしたいことは、コントローラ間でデータを渡すことです。

共有モデルを持つことができます(コントローラーを表示するオブジェクトのインスタンスdアクセス)共有するデータを保持する

通知を使用してデータを渡すことができます(場合によっては最適です)。

ディスクに何かを書き込んで後でもう一度読むことができます。

NSUserDefaultsを使用できます。

KeyChainを使用できます。

...

1

最良の方法は次のとおりです。

  • あなたはそれを作成するときに、単に

でプロパティを設定する第2のビューコントローラ

  • で適切な@propertyを宣言viewController.property = valueYouWantToPass;

  • 0

    私は大きなfaですn人の代表者とプロトコル。
    場合によってはシングルトンパターンを使用します。渡す

    0

    二つの方法/オブジェクトを作成し、この

    QGraduteYr *tableverify=[[QGraduteYr alloc]initWithStyle:UITableViewStyleGrouped]; 
        tableverify.mystring=myString 
        [self.navigationController pushViewController:tableverify animated:YES]; 
    

    他の方法のようなデータを送信

    ビュー・コントローラの間で共有データをデリゲートでそれをSTOR共有委任

    を介してそれを使用しています
    MedicalAppDelegate *appdelegate=(MedicalAppDelegate *)[[UIApplication sharedApplication]delegate]; 
        appdelegate.collnameStr=collStr; 
    

    と、このUST はあなたが必要whereever値をappdelegates

    +1

    答えの2番目の方法は、実際には貧弱な方法です。グローバル変数のようなアプリケーションデリゲートは使用しないでください。これをやっているなら、あなたのコードは考え直す必要があります。 –

    +0

    私の標準を改善するための数字より – Marios

    +0

    喜んで:)。詳細については私の答えhttp://stackoverflow.com/a/8730326/123632をご覧ください。 –

    関連する問題