Передача данных обратно из дочернего контроллера представления
Я новичок, и у меня есть проект, в котором мне нужно передать данные обратно из 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