2013-12-19 72 views
0

我的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

回答

0

這是沒有必要reloaddata與方向的變化,但如果你想重裝表嘗試調用[myTable的reloadData]後臺下載完成後,並只有當方向發生了變化(你可以在orient上設置一個布爾值。)。

+0

這是相反的方向,我不希望它重新加載方向變化的數據。 –

+0

表格視圖不會在方向更改時自動重新加載數據。也許你把它設置在didRotateFromInterfaceOrientation上。請粘貼您的代碼,以便我可以幫助更好! – Firegab

相關問題