私はIOSとObjective-C、そしてMVCパラダイム全体に不慣れで、私は次のことに固執しています。
私は(レプリカ)連絡先アプリに取り組んでいます。ビルドインアプリとしてiPhoneでも利用できます。別のViewControllerを介してデータを渡したいのですが、データはpass(null):(です。
私の質問は、あるビューから別のビューにデータを転送するにはどうすればよいですか?
私はIOSとObjective-C、そしてMVCパラダイム全体に不慣れで、私は次のことに固執しています。
私は(レプリカ)連絡先アプリに取り組んでいます。ビルドインアプリとしてiPhoneでも利用できます。別のViewControllerを介してデータを渡したいのですが、データはpass(null):(です。
私の質問は、あるビューから別のビューにデータを転送するにはどうすればよいですか?
あなたが得たほとんどの答えと同様に、あるコントローラーと別のコントローラーの間でデータを渡すということは、あるコントローラーから別のコントローラーに変数を割り当てることを意味します。連絡先を一覧表示するコントローラーと連絡先の詳細を表示するコントローラーがあり、フローがリストから始まり、連絡先を選択した後に詳細に進む場合は、連絡先変数を割り当てることができます(配列のオブジェクトである可能性があります)。リストに表示されます)、これを表示する直前に詳細ビューコントローラに割り当てます。
- (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
}
一方、詳細コントローラーからリストコントローラーに新しい連絡先を挿入する場合は、リストコントローラーを詳細コントローラーのデリゲートとして割り当てるのが最善の方法だと思います。したがって、連絡先が追加されたときにデリゲートが追加されます。通知され、期待どおりに動作します(配列に連絡先を挿入し、テーブルビューをリロードしますか?)。
@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
技術的には、すべきではありません!
全体的な考え方は、「ビュー」がデータに何が起こるかを制御することではありません。
あなたがしたいのは、コントローラー間でデータを渡すことです(これは、とにかくあなたが計画していることとまったく同じです)。
共有したいデータを保持する共有モデル(両方のView Controllerがアクセスするオブジェクトのインスタンス)を作成できます。
通知を使用してデータを渡すことができます(特定の場合に最適です)。
ディスクに何かを書き込んで、後でもう一度読み取ることができます。
NSUserDefaultsを使用できます。
KeyChainを使用できます。
..。
最良の方法は次のとおりです。
@property2番目 のViewControllerで適切なものを宣言しますviewController.property = valueYouWantToPass;
私はデリゲートとプロトコルの大ファンです。
また、場合によってはシングルトンパターンを使用します。
ViewController間でデータを渡す/共有する2つの方法
オブジェクトを作成し、このようにデータを送信しました
QGraduteYr *tableverify=[[QGraduteYr alloc]initWithStyle:UITableViewStyleGrouped];
tableverify.mystring=myString
[self.navigationController pushViewController:tableverify animated:YES];
別の方法は、デリゲートに保存し、共有デリゲートを介して使用することです
MedicalAppDelegate *appdelegate=(MedicalAppDelegate *)[[UIApplication sharedApplication]delegate];
appdelegate.collnameStr=collStr;
そして、これはあなたが必要とするところならどこでも価値を付加します