Как получить доступ к объектам из одного ViewController в другой ViewController - PullRequest
3 голосов
/ 01 апреля 2009

Предоставьте несколько советов, чтобы избавиться от следующего сценария.

Описание:

У меня есть два viewController, а именно ViewController1 и ViewController2 , так что мы имеем ViewController1.h , ViewController1.m и ViewController2.h , ViewController2.m . Теперь я объявил

NSString *string1;

в ViewController1.h и объявил его как свойство

@property(nonatomic,retain) NSString *string1;

и синтезировал его в ViewController1.m как

@synthesize string1;

и в ViewController1.m , я устанавливаю значение string1 как

string1=@"Hello Every One";

Точно так же я объявил

NSString *string2;

в ViewController2.h и объявил его как свойство

@property(nonatomic,retain)NSString *string2;

и синтезировал его в ViewController2.m как

@synthesize string2;

Если я хочу установить значение string1ViewController1.m ) на string2ViewController2.m ), как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2009

Это зависит от того, где выполняется код, в который вы хотите установить string1. Если это какой-то внешний класс с доступом к обоим объектам контроллера представления, то это просто. Если у вас есть объект ViewController1 vc1 и объект ViewController2 vc2, то все, что вы делаете, это:

[vc1 setString1:[vc2 string2]];

Если вы хотите установить string1 из кода, запускаемого в ViewController2, то вы используете механизм уведомлений. В процедуре инициализации ViewController1 вы вводите:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(aChangeStringMethod:) name:@"anyStringJustMakeItUnique" object:nil];

И определить:

-(void)aChangeStringMethod:(NSNotification)notification{
     string1 = [((ViewController2 *)[notification object]) string2];
}

Затем, во ViewController2, когда вы хотите изменить строку:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:self];

Тот же метод используется, когда вы изменяете строку из какого-то третьего класса, который имеет доступ к vc2, но не к vc1. Код ViewController1 такой же, как и выше, и когда вы хотите изменить строку:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:vc2];

Самая хитрая часть - это если вы хотите изменить строку из ViewController1 (при условии, что у вас нет доступа к объекту vc2). Вы должны использовать два уведомления: указанное выше, а также для ViewController2:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(launchTheOtherNotificationMethod:) name:@"anotherNotificationName" object:nil];

-(void)launchTheOtherNotificationMethod:(NSNotification)notification{
     [[NSNotificationCenter defaultCenter] postNotificationName:@"anyStringJustMakeItUnique" withObject:self];
}

Затем, когда вы хотите изменить строку:

[[NSNotificationCenter defaultCenter] postNotificationName:@"anotherNotificationName" withObject:nil];

Если вы считаете, что это слишком сложно или приводит к чрезмерным накладным расходам, более простое решение - указывать поля в ViewController1 и ViewController2 друг на друга. Затем в ViewController1:

string1 = [myVC2 string2];

А если вы сделаете свойства этих полей, то извне:

[vc1 setString1:[[vc1 myVC2] string2]];

И даже:

[[vc2 myVC1] setString1:[vc2 string2]];
1 голос
/ 23 июня 2011

viewControllers - это стек, поэтому, какой бы метод не был вызван последним, он находится на вершине стека, а тот, из которого он был вызван, является его родителем. Итак, если предположить, что сначала вызывается viewController1, а затем вызывается viewController2, то все, что вам нужно в viewController2.m, это:

[[self parentViewController] setString1:string2]

: D

0 голосов
/ 01 апреля 2009

Вы можете использовать объект модели, который содержит две строки и который известен обоим контроллерам.

Если вы хотите, чтобы каждый контроллер уведомлялся всякий раз, когда другой обновляет значение строк, вы можете использовать механизм уведомлений . Это позволяет вашей модели сообщать другим объектам о своих изменениях и оставаться независимыми от этих объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...