1

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

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

self.ChildViewController.yourProperty = yourValue 

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

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

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

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

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

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

Теперь я хотел бы попробовать четвертый вариант первой, как делегации, КВО и так on - опции, о которых я читал, но не готов к их решению. Последнее, что мне понадобится, - это последний вариант.

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

@interface ViewController() 

@property NSString *ChosenColorInChildVC; 

@end 

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

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

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

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

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

ответ

4

Я расскажу вам пример того, как работает делегация.

Редактировать ваши 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! 
+0

Привет METRONIC. Спасибо за это, это была огромная помощь. Я сделал все, что вы сказали, и (я думаю) понял логику большей части этого. За исключением последнего бита, который вы написали: «На вашем ParentViewController.m: - (void) passValue: (UIColor *) theValue {// здесь вы получаете цвет, переданный из ChildViewController}« Я понимаю более или менее идею, стоящую за ней, но как это реально работает на практике. Скажем, я выбрал красный цвет в контейнере. как мне получить доступ к нему в моем родителе с помощью этого метода? что-то вроде: UIColor * myReceivedColor = [self passValue: ???]; – Paul

+0

Нет, вы получите данные внутри метода - (void) passValue: (UIColor *) theValue; Поместите контрольную точку в этот метод, чтобы убедиться, что она работает, вы можете получить к ней доступ следующим образом: UIColor * myReceivedColor = theValue; – metronic

+0

OK. Извини за это. Я вообще не знаком с понятием «получение ценностей» внутри метода. Поэтому, чтобы я тебя понял. Нужно ли писать что-либо внутри метода - (void) passValue: (UIColor *) theValue {} в моем родителе? И если я хочу получить доступ к цвету в моем родителе ... Я попытался написать litteraly UIColor * myReceivedColor = theValue; и он возвращается с «использованием необъявленного идентификатора:« theValue ». Я также попытался использовать UIColor * myReceivedValue = [self passValue: theValue]; – Paul

0

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

Кроме того, как правило, вы будете включать отправителя в ваших методов делегата:

-(void) childViewController:(ChildViewController*)viewController passValue:(UIColor*) theValue 
0

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

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

@protocol -----

@end

импорт ----

@interface имя_класса ---

Смежные вопросы

 Смежные вопросы