Сколько способов передачи / обмена данными ч / б просмотр контроллера

Я новичок в 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;

и это приложение определяет ценность везде, где вам нужно

Другие вопросы по тегам