2012-03-02 6 views
0

私の人生の間、これを理解できないようです。私はカスタムテーブルビューセルを持っています、そのセルにはいくつかのボタンが設定されています。各ボタンは、ストーリーボードセグを介して他のビューコントローラに接続します。私は最近、これらのセグを削除し、pushViewControllerメソッドを適所に配置しました。さまざまなビューを前後に渡って前後すると、目的のビューコントローラは何も表示されません。私は例としていくつかのコードを持っています。Storyboard SegueをpushViewControllerに置き換えると、奇妙な動作が発生する

[cell.spotButton1 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside]; 
// etc... 
[cell.spotButton4 addTarget:self action:@selector(showSpotDetails:) forControlEvents:UIControlEventTouchUpInside]; 
// etc... 

showSpotDetailsメソッドこのコードが含まれています:

- (void)showSpotDetails:(id)sender 
{ 
    // determine which button (spot) was selected, then use its tag parameter to determine the spot. 
    UIButton *selectedButton = (UIButton *)sender; 
    Spot *spot = (Spot *)[spotsArray_ objectAtIndex:selectedButton.tag]; 

    SpotDetails *spotDetails = [[SpotDetails alloc] init]; 
    [spotDetails setSpotDetailsObject:spot]; 
    [self.navigationController pushViewController:spotDetails animated:YES]; 
} 

詳細VCは、オブジェクトデータを受信しない

ボタンは、この方法が設定されています。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"spotDetailsObject %@", spotDetailsObject_.name); 
} 

以下のNSLogメソッドは、渡されたオブジェクトを出力します。また、詳細ビューコントローラ内のすべては、そのままです。 VCの詳細は変更されていません。私はsegueを削除してpushViewControllerメソッドを追加して以来、何もレンダリングしません。おそらく私はpushViewControllerメソッドで何かを見逃していますか?私は本当にこのようなことはしません、私は常にセグを使用しようとします...

何か提案がありますか?

答えて

3

現実世界へようこそ。以前は、ストーリーボードは松葉杖でした。 View Controllerの仕組みに関する真の事実をあなた自身から隠していました。今、あなたはその松葉杖を捨てようとしています。良い!しかし今、あなたは歩くことを学ばなければなりません。 :)ここのキーは、この行です:

SpotDetails *spotDetails = [[SpotDetails alloc] init]; 

SpotDetailsはUIViewControllerサブクラスです。このUIViewControllerにビューを持たせるためにここでは何もしていません。したがって、あなたは空白の一般的なビューで終わっています! UIViewControllerにビューを持たせたい場合は、を何らかの形で与える必要があります。たとえば、File's OwnerがSpotDetailsインスタンスであるSpotDetails.xibという名前のペンでビューを描画することができます。または、オーバーライドのコードでビューの内容を構築することができますviewDidLoad

http://www.apeth.com/iOSBook/ch19.html

この問題は以前に発生していなかった理由はあなたということです。詳細は、ビューコントローラがビューを取得する方法についてあなたのすべてを伝える私の本を読んで、より良い、のUIViewControllerのドキュメントであり、またはビューコントローラ(すなわち、ストーリーボードファイル)と同じペン先にビューを描きました。しかし、SpotDetailsをalloc-initすると、それはであり、ストーリーボードファイルのものと同じインスタンスではないので、そのビューを取得しません。したがって、ストーリーボードをロードし、 SpotDetailsインスタンス、つまりストーリーボード内のインスタンス(instantiateViewControllerWithIdentifier:を呼び出すこと)をで取得することができます。私はここでそれを行う方法を説明します:

+0

ワウマット、本当にありがとう!私は今あなたの本を読んでいて、歩くことを学んでいます=) – ElasticThoughts

+0

クール、ありがとう。私は問題の原因を正しく特定したことを願っています。 – matt