我有一个viewController(Planner),它在应用程序启动时加载两个视图控制器(InfoEditor和MonthlyPlan).MonthlyPlan隐藏在InfoEditor后面(加载时).
所以我的问题是当我为MonthlyPlan交换InfoEditor时(MonthlyPlan被带到顶部)我如何才能更新MonthlyPlan视图的数据.应用程序启动时正在调用viewDidLoad中的NSLog(这是有道理的.)viewDidAppear和viewWillAppear中的NSLogs没有做任何事情.
有任何想法吗?
谢谢!
- 添加更多细节 -
我自己创建了视图层次结构.一个简单的viewController,只是加载另外两个viewControllers.两个子viewControllers同时加载(在启动应用程序时.)要交换两个视图,我正在使用此代码:
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
交换意见很好.缺少的部分只是告诉子视图的一些方式,你在前面,更新一些属性.
这里缺乏细节.你是如何"交换"这两种观点的?
如果您使用UINavigationController作为容器,那么每当您推送/弹出一个新的viewController时,都会调用viewWillAppear/viewDidAppear.这些调用由UINavigationController本身完成.如果您正在使用UINavigationController,那么请确保您的原型正确用于这些功能.
- (void)viewWillAppear:(BOOL)animated
如果您尝试自己实现视图层次结构,那么您可能需要自己进行这些调用,作为激活/停用视图的一部分.来自viewWillAppear的SDK页面;
如果属于视图控制器的视图直接添加到视图层次结构中,则视图控制器将不会收到此消息.如果向视图层次结构插入或添加视图,并且它具有视图控制器,则应直接向关联的视图控制器发送此消息.
更新:
使用新的详细信息问题很明显:在这种情况下,您必须按照SDK的建议自行发送消失/显示的消息.直接插入/删除/更改视图时,不会自动调用这些函数,它们由提供层次结构支持的更高级代码(例如UINavigationController)使用.
如果您考虑使用exchangeSubView的示例,那么没有任何东西正在消失,一个视图恰好覆盖另一个视图,完全或部分取决于它们的区域和不透明度.
我建议如果你想交换视图,那么你真的根据需要删除/添加,并手动将viewWillAppear/viewWillDisappear通知发送到他们的控制器.
例如
// your top level view controller -(void) switchActiveView:(UIViewController*)controller animated:(BOOL)animated { UIController* removedController = nil; // tell the current controller it'll disappear and remove it if (currentController) { [currentController viewWillDisapear:animated]; [currentController.view removeFromSuperView]; removedController = currentController; } // tell the new controller it'll appear and add its view if (controller) { [controller viewWillAppear:animated]; [self.view addSubView:controller.view]; currentController = [controller retain]; } // now tell them they did disappear/appear [removedController viewDidDisappear: animated]; [currentController viewDidAppear: animated]; [removedController release]; }