Передача данных обратно из дочернего контроллера представления

Я новичок, и у меня есть проект, в котором мне нужно передать данные обратно из childviewcontroller. В частности, у меня есть контейнер выбора в моем контейнере, и я хочу иметь возможность использовать его для выбора опции (скажем, для упрощения выбора цвета из массива из десяти цветов). Затем я хотел бы иметь возможность получить доступ к выбранному цвету в моем родительском контроллере представления и что-то с ним сделать. Я исследовал это в течение нескольких дней и самый близкий ответ на то, что я ищу, я нашел в связанном вопросе о SO. Вот оно:

"Что касается передачи значения в контроллер containerView, вы можете создать свойство в ChildViewController значения, которое вы хотите передать. Затем в вашем ParentViewController сделайте что-то вроде следующего:

self.ChildViewController.yourProperty = yourValue

Противоположное можно сделать четырьмя способами:

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

Вы можете опубликовать уведомление в вашем ChildViewController и добавить родительский контроллер в качестве наблюдателя.

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

И самый простой выход, вы можете создать свойство в вашем parentviewController и получить к нему доступ следующим образом:"

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;

Теперь я хотел бы сначала попробовать четвертый вариант, поскольку делегирование, kvo и т. Д. - это варианты, о которых я читал, но еще не готов к их использованию. То, что мне нужно помочь, это последний вариант.

Скажем, у меня есть свойство в моем дочернем контроллере представления, где я храню выбранный цвет. Что-то вроде:

@interface ViewController ()

@property NSString *ChosenColorInChildVC;

@end

А потом, позже:

self.ChosenColorInChildVC = [self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];

Как бы я передать это значение, используя предложенное:

((YourParentViewControllerClassType *)self.parentViewController).yourParentProperty = TheValueYouWant;

Может ли кто-нибудь еще немного заглушить это для меня? Спасибо

3 ответа

Решение

Я собираюсь объяснить вам на примере, как работает делегирование.

Отредактируйте ваш ChildViewController.h так:

@protocol ChildViewControllerDelegate; 

@interface ChildViewController : UIViewController

@property (weak)id <ChildViewControllerDelegate> delegate;

@end

@protocol ChildViewControllerDelegate <NSObject > 

- (void) passValue:(UIColor *) theValue;

@end

На вашем ChildViewController.m, когда вы хотите передать что-то обратно в ParentViewController, сделайте так:

 - (void) myMethod
 {
   [delegate passValue:[UIColor redColor]]; // you pass the value here
 }

На вашем ParentViewController.h

#import "ChildViewController.h"

@interface ParentViewController : UIViewController <ChildViewControllerDelegate >  // you adopt the protocol
{
}

На вашем ParentViewController.m:

- (void) passValue:(UIColor *) theValue
   {
      //here you receive the color passed from ChildViewController
   }

Теперь будь осторожен. Все будет работать, только если вы установите делегата. Поэтому, когда вы объявляете ChildViewController внутри вашего класса ParentViewController, делайте так:

ChildViewController * controller = [[ChildViewController alloc]initWithiNibName:@"ChildViewController"];
controller.delegate = self; //without this line the code won't work!

Отмечено: это очень важно.

Напишите код объявления протокола над строками #import, например

@protocol -----

@конец

Импортировать ----

@interface classname ---

@metronic прав; использовать делегирование.

Также обычно вы включаете отправителя в ваши методы делегата:

-(void) childViewController:(ChildViewController*)viewController passValue:(UIColor*) theValue 
Другие вопросы по тегам