Сколько способов передачи / обмена данными ч / б просмотр контроллера
Я новичок в IOS и Objective-C и во всей парадигме MVC, и я застрял в следующем.
Я работаю над приложением (реплика) Contact, также доступно в iphone как встроенное приложение. я хочу передать данные через другой контроллер представления, и данные проходят (ноль):(.
У меня вопрос, как мне перенести данные из одного представления в другое?
5 ответов
Как и большинство ответов, которые вы получили, передача данных между одним контроллером и другим просто означает присвоение переменной от одного контроллера другому. Если у вас есть один контроллер для вывода списка контактов, а другой - для отображения сведений о контакте, а процесс начинается со списка и идет подробно после выбора контакта, вы можете назначить переменную контакта (может быть объектом из массива, который отображается в вашем списке) и назначьте его контроллеру подробного представления непосредственно перед его отображением.
- (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
Технически, вы не должны!
Вся идея не в том, чтобы "представления" управляли тем, что происходит с данными.
То, что вы хотите сделать, это передать данные между контроллерами (что, я думаю, именно то, что вы планируете делать в любом случае).
Вы можете иметь общую модель (экземпляр объекта, к которому будут обращаться оба контроллера представления), сохраняя данные, которыми вы хотите поделиться,
Вы можете использовать уведомления для передачи данных (это лучше всего подходит для определенных случаев).
Вы можете записать что-нибудь на диск и прочитать это позже.
Вы можете использовать NSUserDefaults.
Вы можете использовать KeyChain.
...
Лучший способ это:
- объявить соответствующий
@property
во втором виде контроллер - когда вы создаете его, просто установите свойство с
viewController.property = valueYouWantToPass;
Я большой поклонник делегатов и протоколов.
И в некоторых случаях использовать шаблон Singleton.
Два способа передачи / обмена данными между контроллером представления
создать объект и отправил данные, как это
QGraduteYr *tableverify=[[QGraduteYr alloc]initWithStyle:UITableViewStyleGrouped];
tableverify.mystring=myString
[self.navigationController pushViewController:tableverify animated:YES];
другой метод хранит его в делегатах и использует его через общих делегатов
MedicalAppDelegate *appdelegate=(MedicalAppDelegate *)[[UIApplication sharedApplication]delegate];
appdelegate.collnameStr=collStr;
и это приложение определяет ценность везде, где вам нужно