我有一个用于更新一些NSUserDefaults的视图。这些默认值对不同视图中的表有影响。我面临的问题是,我想在再次显示视图之前重新加载表中的数据。
目前我有包含表的viewA
,然后我使用以下代码显示viewB
:
[self presentModalViewController:viewB animated:YES];
一旦用户更新了NSUserDefaults, viewB
被驳回,因此再次显示viewA
。在viewA
显示之前,我希望能够刷新数据。有什么办法可以做到吗?
在viewA的viewWillAppear调用你的刷新代码。
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
// your refresh code
}
通过委托:
viewcontroller应该实现一个协议,该协议是ViewBController提供的
@protocol ViewBControllerProtocol
/*
use full signatures here
*/
@end
@interface ViewBController{
}
@property (nonatomic, assign) id<ViewBControllerProtocol> delegate;
@end;
@interface ViewAController <ViewBControllerProtocol>{
}
@end;
@implemantation ViewAController
// implement the method defined in the protocol
@end
那么
viewB.delegate = viewA
您可以在github上找到示例代码,其中CheckTableController
将是ViewBController
和ShowFavoritesTableController
ViewAController
。
您可以使用presentingViewController
/parentViewController
(请阅读相关文档)。但一个更好的全面解决方案是让"父"成为你的模态控制器的委托,并让父实现委托遵循的协议。
一个更好的解决方案是在块中呈现带有返回代码的模态控制器,但你必须提出自己的解决方案,因为苹果还没有给我们一个。
我猜你在viewA的方法中解散了modalViewController或viewB,如果viewcontroller是你的viewBcontroller的委托。在相同的方法中,您只需要实现所需的表重载数据,并且这将在再次显示viewA之前完成。
我有这样的代码:
在viewBcontroller.h中
@protocol ViewBControllerDelegate <NSObject>
-(IBAction)closeViewBController;
@end
在viewBcontroller.m: -(IBAction)closeView{
[[self parentViewController] performSelector:@selector(closeViewBController)];
}
在viewAcontroller.h: @interface viewAcontroller : UIViewController <ViewBControllerDelegate>
{//....implementation here
和在viewcontroller .m:
-(IBAction)closeViewBController{
[self dismissModalViewControllerAnimated:YES];
//code needed if NSUserDefault is modified
}
很容易写。希望这能回答你的问题