停止UITableView在方向更改时重新加载数据

问题描述:

我的uitableview当设备的方向发生变化时(有意义,因为显示的单元格数目发生了变化,在布局子视图中调用,据我所知可以从文档中了解到) ,但是这对我来说是有问题的,因为我在后台执行下载,而且我不希望某些文件突然出现。有没有办法阻止默认行为,并让我手动重新加载时,我想?编辑: 我会尽力解释更好。在我的桌面视图顶部,我有一个名为“同步”的按钮,它从服务器启动同步请求,此同步请求首先获取JSON对象,该对象包含我希望在tableview中显示的信息,但每个uitableview项目代表我从互联网下载的文件。停止UITableView在方向更改时重新加载数据

当文件正在下载我有一个活动指标在屏幕上,只有当文件完成下载我想重新加载表。问题是,UITableview当用户改变方向时自动调用reloaddata,因此在下载的文件完成下载之前,单元格会填充来自json的信息。

代码:

@implementation BIDManageFilesViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataFinishedDownloading) name:kBIDContentManagerContentDidChangeNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newDataStartedDownloading:) name:kBIDContentManagerStartedDownloadingContent object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentAlreadyUpToDate) name:kBIDContentUpToDate object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentStartingSync) name:kBIDContentStartingSync object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentEndingSync) name:kBIDContentEndingSync object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(singleDownloadFinished) name:kBIDFinishedDownloadingSingleContent object:nil]; 
    self.navigationController.navigationBarHidden = NO; 
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"Sync" 
                    style:UIBarButtonItemStyleDone target:self action:@selector(Sync)]; 
    self.navigationItem.leftBarButtonItem = leftButton; 
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Display Mode" 
                    style:UIBarButtonItemStyleDone target:self action:@selector(dismissSelf)]; 
    self.navigationItem.rightBarButtonItem = rightButton; 

    self.navigationItem.title = @"Content Manager"; 
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero]; 
    [self.view addSubview:_navigationBar]; 
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO]; 

} 
-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 

} 
-(void)layoutNavigationBar{ 
    if([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) 
    { 
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.view.frame.size.width, self.topLayoutGuide.length + 44); 
    } 
    else 
    { 
     self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.view.frame.size.height, self.topLayoutGuide.length + 44); 
    } 
    NSLog(@"width: %f", self.view.frame.size.width); 
    NSLog(@"height: %f", self.view.frame.size.height); 
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0); 
} 

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
    //no need to call super 
    [self layoutNavigationBar]; 
} 
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [self layoutNavigationBar]; 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

} 
-(void)viewDidLayoutSubviews{ 
    [super viewDidLayoutSubviews]; 
    [self layoutNavigationBar]; 
} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 




/* 
#pragma mark - Navigation 

// In a story board-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 

*/ 
-(void)viewDidDisappear:(BOOL)animated 
{ 
    [super viewDidDisappear:animated]; 
    self.navigationController.navigationBarHidden = YES; 

} 
-(void)newDataStartedDownloading: (NSNotification *)notif 
{ 
    self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    _hud.labelText = @"Downloading..."; 
    _hud.detailsLabelText = [NSString stringWithFormat:@"1/%@",[notif.userInfo objectForKey:@"downloadFileNumber"]]; 

} 
-(void)singleDownloadFinished 
{ 
    NSString *currentText = _hud.detailsLabelText; 
    NSArray *subStrings = [currentText componentsSeparatedByString:@"/"]; 
    NSInteger downloadsPlusOne = [[subStrings objectAtIndex:0] integerValue]+1; 
    NSString *newTextForLabel = [NSString stringWithFormat:@"%d/%@", downloadsPlusOne, [subStrings objectAtIndex:1]]; 
    _hud.detailsLabelText = newTextForLabel; 
} 
-(void)newDataFinishedDownloading 
{ 
    _thereIsNewInfo = TRUE; 
    [MBProgressHUD hideHUDForView:self.view animated:YES]; 
    [self.tableView reloadData]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:kBIDnewDownloadedContentReadyToBeDispayedNotification object:nil userInfo:nil]; 

} 
-(void)contentAlreadyUpToDate 
{ 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sync Alert" 
                message:@"Files Are Already Up To Date" 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles: nil]; 
    [alert show]; 

} 
-(void)contentStartingSync 
{ 
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    hud.labelText = @"Syncing..."; 

} 
-(void)contentEndingSync 
{ 
    [MBProgressHUD hideHUDForView:self.view animated:YES]; 

} 
-(void)Sync 
{ 
    [AppDelegate.appContentManager downloadContent]; 
} 
-(void)dismissSelf 
{ 
    if (![AppDelegate.appContentManager subsetArrayFromFileArrayWithNonVidContentThatShouldDisplay] && ![AppDelegate.appContentManager subsetArrayFromFileArrayWithVideoContentThatShouldDisplay]) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Files to Display" 
                 message:@"Please update or enable content" 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles: nil]; 
     [alert show]; 
     return; 
    } 
    else if ([AppDelegate.appContentManager subsetArrayFromFileArrayWithNonVidContentThatShouldDisplay]) 
    { 
     [self dismissViewControllerAnimated:YES completion:Nil]; 

    } 
    else 
    { 
    [self performSegueWithIdentifier:@"goToVideos" sender:self]; 
    } 
} 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"goToVideos"]) 
    { 
     ((BIDViewController *)segue.destinationViewController).stackedByManager = TRUE; 
    } 

} 

@end 
+1

我不明白表格视图与下载文件有什么关系。你能解释一下这个问题好一点还是显示一些代码? – Krumelur

这是没有必要reloaddata与方向的变化,但如果你想重装表尝试调用[myTable的reloadData]后台下载完成后,并只有当方向发生了变化(你可以在orient上设置一个布尔值。)。

+0

这是相反的方向,我不希望它重新加载方向变化的数据。 –

+0

表格视图不会在方向更改时自动重新加载数据。也许你把它设置在didRotateFromInterfaceOrientation上。请粘贴您的代码,以便我可以帮助更好! – Firegab