Search code examples
iphonebuttonnavigationhideback

Hiding Back Button on Navigation Based iPhone App Fails


My issue is that the back button will not restore its visibility if my web request does not finish before or soon after ViewWillAppear has fired.

I have a navigation based iPhone 4.0 application used a simple Root and Detail view setup. I am working with data that is returned from a webservice so when I push my detail view in its ViewDidLoad function I call my web service method in a separate thread and the Iphone lifecycle does its thing on the main thread. I must disable/hide the back button until the web request has finished (or failed) so I call self.navigationItem.hidesBackButton = YES; in ViewDidLoad and self.navigationItem.hidesBackButton = NO; in the delegate function which fires once my web request has finished or failed.

I already tried the following:

[self.navigationItem performSelectorOnMainThread:@selector(setHidesBackButton:) withObject:NO waitUntilDone:NO];
[self.navigationItem setHidesBackButton:NO];
[self.view setNeedsDisplay];
[self.navigationController.view setNeedsDisplay];

UINavigationItem *nav = self.navigationItem;
nav.hidesBackButton = NO;

Root View Controller Push Code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 ArticleViewController *articleViewController = [[ArticleViewController alloc] initWithNibName:@"ArticleViewController" bundle:nil];
 NewsArticle *newsArticle = [newsItems objectAtIndex:indexPath.row];
 articleViewController.articleID = newsArticle.newsID;
 [self.navigationController pushViewController:articleViewController animated:YES];

 [newsArticle release];
 [articleViewController release];
}

Details View Controller Code:

- (void)viewDidLoad {
 [super viewDidLoad];

 self.navigationItem.hidesBackButton = YES;
 id scrollView = [[[self webContent] subviews] objectAtIndex:0];
 if([scrollView respondsToSelector:@selector(setBackgroundColor:)] )
 {
  [scrollView performSelector:@selector(setBackgroundColor:) 
       withObject:[UIColor blackColor]];
 }

 [self getNewsArticle];
}

//Fires when the web request has finished
- (void) finish:(NewsArticle *)newsArticleFromSvc {
 self.navigationItem.hidesBackButton = NO;
 self.newsArticle = newsArticleFromSvc;
 [self bindNewsArtice];
}

Any help is GREATLY appreciated I can hardly @#$&^ believe that hiding a button in a UI could cause me this much wasted time.


Solution

  • I wasn't able to solve this problem. Instead I tweaked my App Logic to make hiding he back button not necessary.