亲爱的程序员,
将导航堆栈中的子项信息传递到一个或多个级别的最佳方法是什么?我在网上搜索过,似乎找不到最好的方法来开始实现这个。
具体来说,这是我的模型:我有一个包含多行的分组表视图。当用户点击一行时,我将它们带到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
一如既往地感谢
安迪
答案 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)
添加属性
@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
访问该属性