我在上一个视图中有一个表视图,它从我的应用程序中的数组中获取数据。我有一个视图来更新推送单元格选择的数据。在视图中更新数据后,我致电
[self.navigationController popViewControllerAnimated:YES];
回到上一个视图。但标签上堆满了旧的和新的数据,我不知道为什么......如果我回到一个视图并再次回到tableview,一切都很好,只显示新数据..
所以我想我必须重建视图以避免这个问题。这可能吗?
答案 0 :(得分:0)
每次要显示时都要刷新表格视图;否则,旧数据将被缓存。
在控制表视图的控制器中:
- (void)viewWillAppear {
[tableView reloadData];
}
答案 1 :(得分:0)
您的问题最初是关于重建控制器的问题,所以这就是答案:
我假设你有这样的导航堆栈:
FirstController
SecondController
ThirdController
在你的第三个控制器中发生了一件事,你现在希望堆栈看起来像这样:
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
而不是让ThirdController
弹出本身,它应该告诉它的代表事情发生了,如下:
[self.delegate thirdControllerDidDoTheThing:self];
您还希望以相同的方式为SecondController
定义委托协议,并且您希望指定SecondController
可以充当ThirdController
的委托:
#import "ThirdController.h"
@protocol SecondControllerDelegate;
@class SecondController : UIViewController <ThirdControllerDelegate>
@property (nonatomic, weak) id<SecondControllerDelegate> delegate;
... your existing stuff ...
@end
@protocol SecondControllerDelegate <NSObject>
- (void)secondControllerDidDoTheThing:(SecondController *)secondController;
@end
请注意我们在<ThirdControllerDelegate>
行之后添加@class
的额外位。
现在我们找到显示SecondController
的{{1}}部分,并让它首先设置控制器的委托:
ThirdController
当- (void)showThirdControllerAnimated:(BOOL)animated
{
ThirdController *thirdController = [[ThirdController alloc] init];
thirdController.delegate = self;
[self.navigationController pushViewController:thirdController animated:animated];
}
收到来自SecondController
的消息时,它应该将其传递给其委托,如下所示:
ThirdController
最后,我们修改- (void)thirdControllerDidDoTheThing:(ThirdController *)thirdController
{
[self.delegate secondControllerDidDoTheThing:self];
}
,以便它可以充当FirstController
的代理人:
SecondController
当我们显示#import "SecondController."
@class FirstController : UIViewController <SecondControllerDelegate>
时,我们将SecondController
作为其委托:
FirstController
最后,我们实现- (void)showSecondControllerAnimated:(BOOL)animated
{
SecondController *secondController = [[SecondController alloc] init];
secondController.delegate = self;
[self.navigationController pushViewController:secondController animated:animated];
}
的委托方法弹出到第一个控制器,然后显示一个新的secondController。
SecondController
完成。
你已经改变了你的问题;在您现在描述的情况下,您可以按照上述步骤将- (void)secondControllerDidDoTheThing:(SecondController *)secondController
{
[self.navigationController popToViewController:self animated:NO];
[self showSecondControllerAnimated:NO];
}
作为SecondController
的代表,但在ThirdController
内,您只需重新加载thirdControllerDidDoTheThing
的数据的观点;如果它是SecondController
或UITableView
,您可以使用UICollectionView
方法执行此操作。