默认更新detailViewController

时间:2010-12-25 08:36:41

标签: iphone cocoa-touch uitableview

我创建了一个允许用户添加信息的应用程序(来自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中声明的已保存数组中加载信息。

有什么想法吗?

2 个答案:

答案 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方法中的参数传递。

但你真的不需要这个......而是这样做:

detailViewControllereditViewController中,创建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 !!!