Objective c 是否可以强制重建导航控制器的上一个视图
我在上一个视图中有一个表视图,它是从我的应用程序中的数组获取数据。我有一个更新数据的视图,它是按单元格选择。在视图中更新数据后,我调用Objective c 是否可以强制重建导航控制器的上一个视图,objective-c,uinavigationcontroller,Objective C,Uinavigationcontroller,我在上一个视图中有一个表视图,它是从我的应用程序中的数组获取数据。我有一个更新数据的视图,它是按单元格选择。在视图中更新数据后,我调用 [self.navigationController popViewControllerAnimated:YES]; 返回到上一个视图。但是标签上堆满了新旧数据我不知道为什么。。。如果我返回一个视图,然后再次返回tableview,则一切正常,只显示新数据 所以我想我必须重建视图来避免这个问题。这可能吗?您应该在每次显示表视图时刷新它;否则,旧数据将被缓存
[self.navigationController popViewControllerAnimated:YES];
返回到上一个视图。但是标签上堆满了新旧数据我不知道为什么。。。如果我返回一个视图,然后再次返回tableview,则一切正常,只显示新数据
所以我想我必须重建视图来避免这个问题。这可能吗?您应该在每次显示表视图时刷新它;否则,旧数据将被缓存 在控制表视图的控制器中:
- (void)viewWillAppear {
[tableView reloadData];
}
您的问题最初是关于重建控制器的,下面是答案: 我假设您的导航堆栈如下所示:
@protocol ThirdControllerDelegate;
@class ThirdController : UIViewController
@property (nonatomic, weak) id<ThirdControllerDelegate> delegate;
... your existing stuff ...
@end
@protocol ThirdControllerDelegate <NSObject>
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController;
@end
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController
{
[self.delegate secondControllerDidDoTheThing:self];
}
FirstController的实例
SecondController的实例
ThirdController的一个实例
在第三个控制器中发生了一件事,您现在希望堆栈如下所示:
@protocol ThirdControllerDelegate;
@class ThirdController : UIViewController
@property (nonatomic, weak) id<ThirdControllerDelegate> delegate;
... your existing stuff ...
@end
@protocol ThirdControllerDelegate <NSObject>
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController;
@end
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController
{
[self.delegate secondControllerDidDoTheThing:self];
}
FirstController的实例
SecondController的一个新实例
要做的第一件事是在头文件中定义ThirdController的委托协议,如下所示:
@protocol ThirdControllerDelegate;
@class ThirdController : UIViewController
@property (nonatomic, weak) id<ThirdControllerDelegate> delegate;
... your existing stuff ...
@end
@protocol ThirdControllerDelegate <NSObject>
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController;
@end
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController
{
[self.delegate secondControllerDidDoTheThing:self];
}
您还需要以相同的方式为SecondController定义一个委托协议,并指定SecondController可以作为第三个控制器的委托:
当SecondController从ThirdController获取消息时,它应该将消息传递给其委托,如下所示:
@protocol ThirdControllerDelegate;
@class ThirdController : UIViewController
@property (nonatomic, weak) id<ThirdControllerDelegate> delegate;
... your existing stuff ...
@end
@protocol ThirdControllerDelegate <NSObject>
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController;
@end
- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController
{
[self.delegate secondControllerDidDoTheThing:self];
}
最后,我们修改FirstController,使其可以充当SecondController的委托:
最后,我们实现SecondController的委托方法以弹出到第一个控制器,然后显示一个新的SecondController
- (void)secondControllerDidDoTheThing:(SecondController *)secondController
{
[self.navigationController popToViewController:self animated:NO];
[self showSecondControllerAnimated:NO];
}
完成了
你已经改变了你的问题;在您现在描述的情况下,您可以按照上面的步骤使SecondController成为ThirdController的代理,但在ThirdController中,您只需重新加载SecondController视图的数据;如果是UITableView或UICollectionView,您可以使用reloadData方法进行操作。我以前的视图中有一个表视图,它是从我的应用程序中的数组获取数据。我有一个更新数据的视图,它是按单元格选择。在视图中更新数据后,我调用[self.navigationController popViewControllerAnimated:YES];返回到上一个视图。但是标签上堆满了新旧数据我不知道为什么。。。如果我返回一个视图,然后再次返回到tableview,则一切正常,只显示新数据。请编辑您的问题并将其添加到那里。谢谢。标签上堆满了新旧数据。我不知道为什么这是您需要解决的问题。请发布与此标签相关的截图和源代码。这似乎是一个很好的解决方案,我将实现此功能并检查结果