5

私はIOSとObjective-C、そしてMVCパラダイム全体に不慣れで、私は次のことに固執しています。

私は(レプリカ)連絡先アプリに取り組んでいます。ビルドインアプリとしてiPhoneでも利用できます。別のViewControllerを介してデータを渡したいのですが、データはpass(null):(です。

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

4

5 に答える 5

2

あなたが得たほとんどの答えと同様に、あるコントローラーと別のコントローラーの間でデータを渡すということは、あるコントローラーから別のコントローラーに変数を割り当てることを意味します。連絡先を一覧表示するコントローラーと連絡先の詳細を表示するコントローラーがあり、フローがリストから始まり、連絡先を選択した後に詳細に進む場合は、連絡先変数を割り当てることができます(配列のオブジェクトである可能性があります)。リストに表示されます)、これを表示する直前に詳細ビューコントローラに割り当てます。

- (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
于 2012-01-26T12:25:35.590 に答える
2

技術的には、すべきではありません!
全体的な考え方は、「ビュー」がデータに何が起こるかを制御することではありません。

あなたがしたいのは、コントローラー間でデータを渡すことです(これは、とにかくあなたが計画していることとまったく同じです)。

共有したいデータを保持する共有モデル(両方のView Controllerがアクセスするオブジェクトのインスタンス)を作成できます。

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

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

NSUserDefaultsを使用できます。

KeyChainを使用できます。

..。

于 2012-01-26T10:31:29.240 に答える
1

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

  • @property2番目 のViewControllerで適切なものを宣言します
  • 作成するときは、プロパティを次のように設定するだけです。

viewController.property = valueYouWantToPass;

于 2012-01-26T10:33:44.453 に答える
0

私はデリゲートとプロトコルの大ファンです。
また、場合によってはシングルトンパターンを使用します。

于 2012-01-26T10:35:34.540 に答える
0

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;

そして、これはあなたが必要とするところならどこでも価値を付加します

于 2012-01-26T10:55:39.303 に答える