2011-02-11 1 views
0

私はメインテーブルビューを持っています。およびDetailView。セルがクリックされると、そのセルの詳細ビューが表示されます。 DetailViewには、次と前の2つのボタンがあります。 RootViewcontroller.mから詳細ビューボタンを無効にする方法を知りたいコードは次のようになります。DetailViewController UIBarButtonItemをRootViewControllerから無効にするにはどうすればいいですか?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    DetailViewController *nextController = [[DetailViewController alloc] init]; 
    int storyIndex = [indexPath indexAtPosition:[indexPath length] -1]; 
    nextController = [nextController initWithObjectAtIndex:storyIndex inArray:stories]; 

    NSString *storyTitle = [[stories objectAtIndex:storyIndex] objectForKey:@"title"]; 
    nextController.title = @"Details"; 

    UIBarButtonItem *tempButtonItem = [[[UIBarButtonItem alloc] init] autorelease]; 
    tempButtonItem.title = @"Back"; 

    self.navigationItem.backBarButtonItem = tempButtonItem ; 

    nextController.sTitle = storyTitle; 
    [self.navigationController pushViewController:nextController animated:YES]; 

    [nextController release]; 

} 

私はすでにnextController.next.enabled = NOを試してみましたし、[nextController.nextは、setEnabled:NO]をこの行の後: [self.navigationController pushViewControllerを:nextControllerアニメーション:YES];

ここで、nextはDetailViewControllerにあるUIBarButtonItemの名前です。 誰でもそのボタンを無効にする方法を教えていただけます。 事前に

答えて

1

View ControllerとViewは同時にロードされません。これは、あなたのケースでDetailViewControllerのオブジェクトをインスタンス化すると、ビューが描画されないことを意味します(そして、Nibを使用している場合)。これは遅延読み込みの概念の一部です。

最初にsetEnabled = NOメッセージを送信すると、オブジェクトはnilになります(Objective Cではnilのオブジェクトにメッセージを送信できます)。

例:

[nextController setEnabled:NO][nil setEnabled:NO]に等しく、これはあなたが望むものを確実ではありません。

次回は、メモリ警告とビューがアンロードされない限り、ビューはメモリ内にあり、ボタンへの参照はもはやゼロにならないので、2度目に呼び出すと機能します。

そして、あなたは、あなたのアプリケーションのコンテキストに応じてのviewDidLoad/viewWillAppearにこのコードを入れて無効にするためにボタンを初期化したい場合はpushViewController:animate

上記のコード行を追加します。

これは1つの解決策に過ぎません。コメントでリクエストに答え編集


:DetailviewControllerであなたの初期化メソッドでは

は、この追加:

self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(backToRoot)] autorelease]; 

- (void)backToRoot { 
    [self.navigationController popToRootViewControllerAnimated:YES]; 
} 

をしても、あなたのHEADERFILEにメソッドシグネチャを追加します。

UINavigationControllerへの参照:http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html

+0

クール。その働き。驚くばかり。 DetailViewにあるバックボタンのターゲットまたはアクションを設定する方法を教えてください。私が3番目のアイテムをクリックすると、3番目のアイテムの詳細ビューに移動し、その後、次のボタンを使用します。私は4番目のアイテムのdetailViewに行きます。今私はそれを私は3番目の項目のdetailviewの代わりにRootViewに移動する必要がありますバックボタンをクリックする場合。私はstackoverflowでその質問を書いたが、残念ながら何の答えも得られなかった。 – Piscean

+0

私の更新された回答を参照してください。 – LuckyLuke

+0

素晴らしいあまりにも多くのamigoありがとう。私は最後の3日以来、それについて取り組んでいましたが、解決策を見つけられませんでした。まあ、私はちょうど1週間前にiPhoneの開発に足を踏み入れた。物事をたくさん読まなければならない。しかし、もう一度、本当にありがとう。世話をする。 – Piscean

関連する問題