Передать NSString из одного класса в другой - PullRequest
0 голосов
/ 28 августа 2011

У меня есть странная проблема: я не могу передать NSString из одного класса в другой. Я развернул тот же метод, который работал на других классах.

Я пытаюсь передать строку из secondViewController в мой firstViewController. Вот что я сделал.

firstViewController.h

NSString *pickUpAddressString;
@property (nonatomic, retain) NSString *pickUpAddressString;

firstViewController.m

@synthesize pickUpAddressString;
-(void) viewWillAppear:(BOOL)animated {
NSLog(@"pickUpAddressString is %@", pickUpAddressString); // why it's null here?
    PickUpAddress.text = pickUpAddressString; // PickUpAddress is a UITextField
}

secondViewController.m

FirstViewController *controller = [[FirstViewController alloc]init];
    controller.pickUpAddressString = selectedAddress; // here, I set the string
    NSLog(@"selected address :%@\npickUpAddressString:%@", selectedAddress, controller.pickUpAddressString); // I had verified that both strings are valid.
    [self.navigationController popViewControllerAnimated:YES]; // pop to firstView

1 Ответ

3 голосов
/ 28 августа 2011

Вы создаете новый экземпляр FirstViewController ...

FirstViewController *controller = [[FirstViewController alloc]init];

... отличающийся от исходного экземпляра, который (я предполагаю) выдвинул SecondViewController и к которому вывозврат через popViewControllerAnimated:.


По сути, вам нужно передать данные обратно в контроллер, который выдвинул SecondViewController, в данном случае, FirstViewController.

Возможно, самый простой способ добиться этого - то, что @Ladislav предложил в своем комментарии:

NSArray *viewControllers = [self.navigationController viewControllers];
FirstViewController *firstVC = [viewControllers objectAtIndex:[viewControllers count] - 2];

Однако имейте в виду, что это вводит прямую зависимость между SecondViewController и FirstViewController.Или, другими словами, SecondViewController теперь тесно связан с FirstViewController.

В двух словах, когда речь идет о передаче данных обратно в иерархию, рекомендуется использовать свободныйсвязь , чтобы избежать прямой зависимости между вашими контроллерами вида (жесткая связь).Преимущества этого включают повторное использование кода и тестируемость.Для достижения слабой связи необходимо определить общий интерфейс для наблюдателей (например, делегирование, уведомления и т. Д.).

Стоит также упомянуть важность размещения информации о состоянии в объектах модели.,Старайтесь не размещать данные внутри контроллеров, если только они не являются строго презентационными данными.

Подробнее по этой теме: Какой лучший способ связи между контроллерами представления?

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