是否可以强制重建导航控制器的先前视图

时间:2013-12-31 16:01:01

标签: objective-c uinavigationcontroller

我在上一个视图中有一个表视图,它从我的应用程序中的数组中获取数据。我有一个视图来更新推送单元格选择的数据。在视图中更新数据后,我致电

[self.navigationController popViewControllerAnimated:YES]; 

回到上一个视图。但标签上堆满了旧的和新的数据,我不知道为什么......如果我回到一个视图并再次回到tableview,一切都很好,只显示新数据..

所以我想我必须重建视图以避免这个问题。这可能吗?

2 个答案:

答案 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的数据的观点;如果它是SecondControllerUITableView,您可以使用UICollectionView方法执行此操作。