私の問題は、Web リクエストが発生する前または直後に終了しない場合、戻るボタンの表示が復元されないことViewWillAppear
です。
シンプルなルート ビューと詳細ビューのセットアップを使用するナビゲーション ベースの iPhone 4.0 アプリケーションがあります。私は Web サービスから返されたデータを操作しているので、詳細ビューをそのViewDidLoad
関数にプッシュすると、別のスレッドで Web サービス メソッドが呼び出され、Iphone ライフサイクルはメイン スレッドで処理されます。Web リクエストが終了する (または失敗する) まで [戻る] ボタンを無効化/非表示にする必要があるためself.navigationItem.hidesBackButton = YES;
、ViewDidLoad とself.navigationItem.hidesBackButton = NO;
、Web リクエストが終了または失敗したときに起動するデリゲート関数を呼び出します。
私はすでに次のことを試しました:
[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;
ルート ビュー コントローラーのプッシュ コード:
- (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];
}
詳細ビュー コントローラ コード:
- (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];
}
@#$&^ UI でボタンを非表示にすると、これほど多くの時間が無駄になるとは信じられません。