iPhone - 在导航堆栈中将数据从子节点传递到父节点

时间:2011-09-12 06:58:23

标签: iphone ios uinavigationcontroller

亲爱的程序员,

将导航堆栈中的子项信息传递到一个或多个级别的最佳方法是什么?我在网上搜索过,似乎找不到最好的方法来开始实现这个。

具体来说,这是我的模型:我有一个包含多行的分组表视图。当用户点击一行时,我将它们带到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

一如既往地感谢

安迪

4 个答案:

答案 0 :(得分:4)

UINavigationController有一个属性viewControllers,它返回堆栈中所有视图控制器的NSArray

“父”视图控制器(即当前可见视图控制器下方的视图控制器)可通过以下方式获取:

TableViewController *parentViewController = (TableViewController*)[self.navigationController.viewControllers objectAtIndex:self.navigationController.viewControllers.count - 2];

然后,您可以根据需要调用任何方法或设置属性。

答案 1 :(得分:4)

在回叫中,最好和推荐的方法之一是代表

在您的情况下,您需要创建一个DataViewControllerDelegate并在此处放置此类的Delegates可以调用的所有方法。现在,父进程应该实现这个委托,并在初始化时将自己注册为委托。

最好通过示例,查看Jonathan's answer制作自定义代理。

答案 2 :(得分:1)

这样的东西?

我看不到你的所有代码结构,所以我对继承和类结构做了一些假设。

获取父视图控制器的视图,将其转换为UIView的相应子类并将消息传递给它。

[((MayNeedCastToSpecificClass*)[self.view parentViewController].view) setMyDate:date];

答案 3 :(得分:0)

你的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

访问该属性