Сколько способов передачи / обмена данными ч / б просмотр контроллера - PullRequest
4 голосов
/ 26 января 2012

Я новичок в IOS, Objective-C и во всей парадигме MVC, и я застрял в следующем:

Я работаю над приложением (реплика) Contact, также доступным в iphone как встроенное приложение.я хочу передать данные через другой контроллер представления, и данные передаются (null): (.

Мой вопрос: как мне перенести данные из одного представления в другое?

Ответы [ 5 ]

2 голосов
/ 26 января 2012

Как и большинство ответов, которые вы получили, передача данных между одним контроллером и другим просто означает присвоение переменной от одного контроллера другому. Если у вас есть один контроллер для вывода списка контактов, а другой - для отображения сведений о контакте, а процесс начинается со списка и идет подробно после выбора контакта, вы можете назначить переменную контакта (это может быть объект из массива, который отображается в вашем списке) и назначьте его контроллеру подробного вида непосредственно перед его отображением.

- (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
2 голосов
/ 26 января 2012

Технически, вы не должны!
Вся идея не в том, чтобы «представления» контролировали, что происходит с данными.

То, что вы хотите сделать, - это передавать данные между контроллерами (что, я думаю, именно то, что вы планируете делать в любом случае).

Вы можете иметь общую модель (экземпляр объекта, к которому имеют доступ оба контроллера представления), сохраняя данные, которыми вы хотите поделиться,

Вы можете использовать уведомления для передачи данных (лучше всего подходитв некоторых случаях).

Вы можете записать что-нибудь на диск и прочитать позже.

Вы можете использовать NSUserDefaults.

Вы можете использовать KeyChain.

...

1 голос
/ 26 января 2012

Лучший способ это:

  • объявляет соответствующий @property во втором контроллере вида
  • при создании просто установите свойство с помощью

viewController.property = valueYouWantToPass;

0 голосов
/ 26 января 2012

два способа передачи / обмена данными между контроллером представления

создайте объект и отправьте данные вот так

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

другой метод хранит его в делегатах и ​​использует его через общих делегатов

MedicalAppDelegate *appdelegate=(MedicalAppDelegate *)[[UIApplication sharedApplication]delegate];
    appdelegate.collnameStr=collStr;

и только это приложение указывает значение везде, где вам нужно

0 голосов
/ 26 января 2012

Я большой поклонник делегатов и протоколов.
И в некоторых случаях использую шаблон Singleton.

...