iPhone - передача данных от ребенка к родителю в стеке навигации - PullRequest
1 голос
/ 12 сентября 2011

Уважаемые коллеги-программисты,

Каков наилучший способ передачи информации от ребенка в стеке навигации на один или несколько уровней? Я искал в Интернете и, похоже, не могу найти лучший способ начать реализацию этого.

В частности, это моя модель: у меня сгруппированное табличное представление с несколькими строками. Когда пользователь нажимает на строку, я беру их в MVC. То есть щелчок по строке «выбрать дату» переводит их в MVC с настройкой выбора даты (родительский процесс передает данные дочернему элементу в процессе). Как выбрать данные обратно (или другой фрагмент данных), как мне передать данные обратно? Вот какой-то код установки, если он помогает:

/* following is inside didSelectRowAtIndexPath of parent in navigation stack */

if (row == 1) {
    DateViewController *datevc = [[DateViewController alloc] init];
    datevc.selectedDate = [self dateToEnter];
    [self.navigationController pushViewController:datevc animated:YES;
    [datevc release];
}

DateViewController.h

#import <UIKit/UIKit.h>

@interface EnterProcedureDateViewController : UIViewController {
    IBOutlet UIDatePicker *datePicker;
    NSDate *selectedDate;
}

@property (nonatomic, retain) IBOutlet UIDatePicker *datePicker;
@property (nonatomic, retain) NSDate *selectedDate;

-(IBAction)selectButtonPressed:(id)sender;

@end

DateViewController.m

#import "DateViewController.h"

@implementation EnterProcedureDateViewController

@synthesize datePicker;
@synthesize selectedDate;

-(IBAction)selectButtonPressed:(id)sender {

    /* how do I pass the date pickers date back to the ivar dateToEnter of parent?? */

    [self.navigationController popViewControllerAnimated:YES];
}

-(void)viewWillAppear:(BOOL)animated {
    if (selectedDate == nil) {
        datePicker.date = [NSDate date];
    } else {
        datePicker.date = selectedDate;
    }
    [super viewWillAppear:animated];
}

...

@end

Заранее спасибо как всегда

Andy

Ответы [ 4 ]

4 голосов
/ 12 сентября 2011

UINavigationController имеет свойство viewControllers, которое возвращает NSArray всех контроллеров представления в стеке.

«Родительский» контроллер вида (т. Е. Тот, который находится ниже вашего видимого в данный момент) может быть получен:

4 голосов
/ 12 сентября 2011

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

В вашем случае вам нужно будет создать DataViewControllerDelegate и поместить здесь все методы, которые могут вызывать делегаты этого класса. Теперь родительский объект должен реализовать этот делегат и зарегистрировать себя в качестве делегата при его инициализации.

Лучше с примером, посмотрите на ответ Джонатана о создании пользовательских делегатов.

1 голос
/ 12 сентября 2011

Как то так?

Я не вижу всей вашей структуры кода, поэтому я сделал некоторые предположения о наследовании и структуре классов.

Получает представление родительского контроллера представления, приводит его к соответствующему подклассу UIView и передает ему сообщение.

[((MayNeedCastToSpecificClass*)[self.view parentViewController].view) setMyDate:date];
0 голосов
/ 31 мая 2012

в вашем parentviewcontroller добавьте свойство

   @property (nonatomic, retain) NSDate *selectedDate;

в childViewController после выбора даты

parentViewController *parentViewController =[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];
parentViewController.selectedDate = self.selectedDate;
[self.navigationController popViewControllerAnimated:YES];

, после чего вы сможете получить доступ к свойству из parentviewcontroller

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