2

私の最初の質問をスタックオーバーフローに投稿してください! 私の質問が明確であることを願っています、ここにあります...

テーブルビューを持つ最初のビューコントローラーにナビゲーションコントローラーが埋め込まれています。テーブル ビューから、First Detail Controller にプッシュするセグエがあります。すべてが正常に機能し、セグエはデータを最初の詳細コントローラーに渡しますが、ボタンから2番目の詳細コントローラーに再度プッシュしたいと思います。

絵コンテ内のレイアウトはこんな感じ 絵コンテの画像

セカンド ディテール コントローラーをセットアップし、ファースト ディテール コントローラーのボタンから押しました。ただし、配列にあるデータを Second Detail Controller に渡す方法がわかりません。何が渡されたかを確認するために NSLog 行を追加しましたが、デバッグ パネルは " (null) "を出力しています。

これは、ColorBookViewController という名前の .m First View Controller からの私の viewdidload と segue コードです。

- (void)viewDidLoad
{
    [super viewDidLoad];

    Color *color1 = [Color new];
    color1.name = @"Red";
    color1.hexnumber = @"FF0000";
    color1.spanishname =@"Rojo";

    Color *color2 = [Color new];
    color2.name = @"Green";
    color2.hexnumber = @"00FF00";
    color2.spanishname =@"Verde";


    Color *color3 = [Color new];
    color3.name = @"Blue";
    color3.hexnumber = @"0000FF";
    color3.spanishname = @"Azul";

    colors = [NSArray arrayWithObjects: color1,color2,color3, nil];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
   if ([segue.identifier isEqualToString:@"showColorDetail"]) {
       NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
       ColorDetailViewController *destViewController = segue.destinationViewController;
       destViewController.color = [colors objectAtIndex:indexPath.row];
       }
}

以下は、ColorDetailController という名前の最初の詳細コントローラーの .m から読み込まれたビューです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"This is...%@", color.name);
    self.nameLabel.text = color.name;
    self.hexnumberLabel.text = color.hexnumber;
}

SecondDetailController の私の .h:

#import <UIKit/UIKit.h>
#import "Color.h"

@interface SecondDetailViewController : UIViewController

@property (nonatomic,weak) IBOutlet UILabel *spanishnameLabel;
@property (nonatomic, strong) Color *color;

@end

以下は、SecondDetailController という名前の Second Detail Controller の .m から読み込まれたビューです。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = color.name;
    NSLog(@"This is...%@", color.spanishname);
    self.spanishnameLabel.text = color.spanishname;
}

アプリはシミュレーターで正常に動作しますが、Second Detail Controller の空白の画面が表示され、NSLog(@"This is...%@", color.spanishname); から "null" の結果が得られます。

セグエが最初の詳細ビューのインスタンスを渡して保持するが、2 番目の詳細ビューを保持しない理由について何か提案はありますか? それとも、ここでもっと基本的な何かが欠けていますか? First Detail Controller で 2 番目のセグエを設定しようとしたところ、NSLog は正しい結果 (スペイン語の色名) を生成しましたが、これを Second Detail Controller に渡す方法がわかりません。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showMoreDetail"]) {

        NSLog(@"This is... %@",color.spanishname);  //works fine
        self.spanishnameLabel.text = color.spanishname;  //throws error 
        }
}

助けや洞察をありがとう!

プロジェクト全体のダウンロードはこちら

4

1 に答える 1

0

データを 2 番目の ViewController に渡すには、最初の ViewController で行ったのとまったく同じことを行いColorます。オブジェクトの参照をセグエで渡します。

にはSecondDetailViewController、すでにカラー プロパティがあります。Colorで選択したのと同じオブジェクトを使用して、このプロパティを設定するだけColorBookViewControllerです。この参照は既に にあるので、セグエ経由ColorDetailViewControllerで に直接渡すだけです。SecondDetailViewController

あなたの中にColorDetailViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if ([segue.identifier isEqualToString:@"showMoreDetail"]) {
       SecondDetailViewController *destViewController = segue.destinationViewController;
       destViewController.color = self.color;
   }
}

viewDidLoadのではSecondDetailViewController、次のようにラベルを正しく設定できます。self.spanishnameLabel.text = color.spanishname;

于 2013-08-26T03:14:31.147 に答える