我创建了一个允许用户添加信息的应用程序(来自addViewController),然后将其显示在rootViewController上的UITableView中。当用户点击tableViewCell时,detailViewController会显示,您猜对了,有关输入的用户信息的更多详细信息。我想要完成的是设置一个editViewController,允许用户编辑他们已经提交的信息。
目前,我正在尝试使用之前由用户提交的信息自动填充editViewController(之后他们可以按保存并更新信息)。但是,我在试图执行这种自动填充时遇到困难,我不确定这是否是实现此目的的最佳途径。
这是从detailViewController加载editViewController的编辑方法。
-(IBAction)editDetails:(id)sender {
editViewController *evc = [[editViewController alloc] initWithNibName:@"editViewController" bundle:nil];
rootViewController *rvc = [[rootViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:evc];
[[self navigationController] presentModalViewController:navigationController animated:YES];
///For Style
NSInteger styleCount = [[rvc scoreTypeArray] count];
NSInteger styleRows = [rvc.scoreTypeArray objectAtIndex:indexPath.row]; ///HERE I GET AN ERROR MESSAGE SAYING THAT indexPath IS NOT DEFINED
///For Date
NSInteger count = [[rvc dateArray] count];
NSInteger rows = [[rvc indexPath] row]; ///AND HERE I GET A WARNING MESSAGE SAYING rootViewController MAY NOT RESPOND TO INDEX PATH, AND OF COURSE IT DOESN'T WORK
[[evc dateField] setText:[NSString stringWithFormat:@"%@", [[evc dateArray] objectAtIndex:(count-1-rows)]]];
[[evc styleField] setText:[NSString stringWithFormat:@"%@", [[rvc scoresArray] objectAtIndex:(styleCount-1-styleRows)]]];
[navigationController release];
[evc release];
[rvc release];}
所以我在这里尝试从我的rootViewController中声明的已保存数组中加载信息。
有什么想法吗?
答案 0 :(得分:0)
使用retain在编辑视图中创建属性,然后只编辑该值。保留只是给你和引用原始对象。文本字段上的setText只是创建字符串的新副本。 如果要执行此操作,可以在“编辑”视图中创建委托协议,并将当前导航控制器设置为编辑视图的委托,该编辑视图将作为编辑视图的委托。并且在你的编辑视图中,当他将消失时调用委托方法。
委派文档here
声明属性doc here
祝你好运。答案 1 :(得分:0)
以及...
NSInteger styleRows = [rvc.scoreTypeArray objectAtIndex:indexPath.row];
这是错误的,因为您正在尝试访问未在此方法中定义的indexPath.row。 IndexPath.row通常在tableView的方法中使用,如
(tableView*)didSelectRowAt:(NSIndexPath*)indexPath
因此,您必须将tableView的delegatemethods中的值indexPath.row作为editDetails方法中的参数传递。
但你真的不需要这个......而是这样做:
在detailViewController
和editViewController
中,创建NSString *dateObject
并将其设为@property(nonatomic,assign).
现在在你的根视图控制器的didSelectRowAtIndexPath
中,当用户点击该行时,
[dvc setDateObject:self.dateArray objectAtindex:indexPath.row];
现在,detailViewController
包含对dateObject中原始日期的引用。您在此处所做的任何更改也将更改rootViewController的dateArray中的日期。
因此,当使用点击编辑按钮时,请调用
-(IBAction)editDetails:(id)sender {
editViewController *evc = [[editViewController alloc] initWithNibName:@"editViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:evc];
[evc setDateObject:self.dateObject];
[[self navigationController] presentModalViewController:navigationController animated:YES];
[navigationController release];
[evc release];
}
现在,您再次将原始dateObject传递给editViewController。在其viewDidLoad中,设置textField,当用户编辑和完成命令时,将editViewController中的dateObject替换为修改后的dateObject。请记住,这是从rootViewController作为引用传递的原始dateObject。所以你在rootViewController的dateArray中也替换了它。现在你只需要知道什么时候从detailViewController返回到rootViewController并执行[table reloadData];
tadan !!!