如何正确清空通过UIStoryboard实例化的UITableView?

时间:2014-05-23 23:46:53

标签: ios uitableview uistoryboard

我在Storyboard文件中定义了UINavigationController个流程。根控制器是当前用户有权访问的用户列表,当被点击时,它会向被点击的用户推送聊天视图。这部分功能很好,聊天视图控制器通过它的segue被压入堆栈,并加载它应该加载的消息。

当我弹出聊天视图并选择其他用户时会出现问题,当聊天加载时,它会清空来自其他用户的旧消息,并用来自当前所选用户的消息替换它们。这意味着该视图将使用旧数据持久存储在内存中。我已尝试将NSFetchedResultsController设置为nil并重新加载数据并处理tableView:numberOfRowsInSection:方法的特殊情况,如果0则返回NSFetchedResultsController }是nil

有没有办法卸载此视图或在转换到它之间清除表数据以防止剩余的视图数据?

我觉得某些代码示例可能很相关:

// View controller that loads the chat view
// Not the view with leftover data
- (void)collectionView:(UICollectionView *) didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    self.selectedUser = [[self.fetchedResultsController fetchedObjects] objectAtIndex:indexPath.item];
    [self performSegueWithIdentifier:@"userListToChatView" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"userListToChatView"]) {
        ChatViewController *ctrl = [segue destinationViewController];
        ctrl.recipient = self.selectedUser;
        self.selectedUser = nil;
    }
}

在ChatViewController中:

@interface ChatViewController ()

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;

@end

@implementation ChatViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [RequestConnection fetchMessagesForUser:[SessionManager currentUser]];
    [self.fetchedResultsController performFetch:nil];
}

// Standard table view data source methods, fetching cell information for index
// paths and returning the number of items in the fetched results controller

- (NSFetchedResultsController *)fetchedResultsController {
    if (!_fetchedResultsController) {
        // Create Fetch Request, Sort Descriptors and Fetched Results Controller
    }

    return _fetchedResultsController;
}

@end

我尝试过这样的viewDidDisappear方法:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    _fetchedResultsController.delegate = nil;
    _fetchedResultsController = nil;

    [self.tableView reloadData];
}

// And modified the numberOfRowsInSection
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (_fetchedResultsController) {
        return [[self.fetchedResultsController fetchedObjects] count];
    } else {
        return 0;
    }
}

遗憾的是,没有解决问题。每次我弹出聊天控制器并交换选定的用户时,再次执行segue,它会激活前一个视图中的单元格并加载当前的单元格。我希望(并期望它)每次都从一个干净的石板开始。

再次:有没有办法完全卸载通过Storyboard实例化的视图(在UINavigationController流程中)或更好的方法,用于在表视图中重置弹出和推送所述视图之间的数据控制器吗

编辑我在代码示例中错误拼写“消失”并道歉,该方法在项目中拼写正确,并且正在被调用(已验证)。感谢@dietbacon抓住它。

2 个答案:

答案 0 :(得分:1)

如果您在initWithFetchRequest ... cacheName:上提供了缓存名称,则可以通过使用您最初提供的名称调用类方法+(void)deleteCacheWithName:(NSString *)name来清除它。

我还没有尝试过这个想法,但我认为它应该在viewWillAppear上正常工作:

答案 1 :(得分:0)

应该是

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

而不是

- (void)viewDidDissapear:(BOOL)animated {
    [super viewDidDissapear:animated];

检查是否正在调用该方法。我打赌不是。

另一件事:我不明白为什么你要创建一个属性并使用它的变量而不是使用setter和getter?但这与问题无关,只是评论。