0

VC1 = NewGameViewController
VC2 = GameViewController

NewGameViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if( [segue.identifier isEqualToString:@"newGameSegue"]) {
    GameViewController *gameVC = (GameViewController *)segue.destinationViewController;

    NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
    gameVC.nameArray = [[NSArray alloc] initWithArray:array];
}

-(NSArray *)nameArrayForTextFieldArray:(NSArray *)array withColon:(BOOL *)bool 基本的に、テキストフィールドの nsarray を指定すると、文字列の nsarray を返します。withcolon は、文字列の末尾にコロンを追加するかどうかのブール値です。

コードをデバッグすると、gameVC の _nameArray ivar は、ここですべての行が呼び出された後も nil を読み取ります...誰か助けてくれませんか??

4

3 に答える 3

7

prepareForSegue メソッドは、ある画面から別の画面へのセグエが実行されようとしているときに、UIKit によって呼び出されます。これにより、新しいView Controllerが表示される前にデータを渡すことができます。通常、そのプロパティを設定することでそれを行います。

新しいView Controllerはsegue.destinationViewControllerにあります。GameViewController がナビゲーション コントローラーを埋め込む場合、新しいビュー コントローラーは GameViewController ではなく、それを埋め込むナビゲーション コントローラーになります。GameViewController オブジェクトを取得するには、ナビゲーション コントローラーの topViewController プロパティを調べます。このプロパティは、ナビゲーション コントローラー内で現在アクティブな画面を参照します。

オブジェクトを新しいView Controllerに送信するには、次を使用してこのソリューションを使用できますperformSegueWithIdentifier

たとえば、 a を押してセグエを実行したい場合は、次のようUIButtonにできます。

IBAction (UIButton に接続) を作成し、MyViewController.hボタンをストーリーボードからコードにドラッグします。

- (IBAction)sendData:(id)sender;

MyViewController.mメソッドを実装します。

- (IBAction)sendData:(id)sender
{
    NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
    [self performSegueWithIdentifier:@"newGameSegue" sender:array];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"newGameSegue"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        GameViewController *controller = (GameViewController *)navigationController.topViewController;
        controller.nameArray = sender;
    }
}
于 2012-07-04T08:25:19.253 に答える
0

arrayを設定する直前にNSLog を実行した (またはデバッガーで調べた) と仮定していますgameVC.nameArray。あなたは本当にそれがあなたが思うように設定されていることを確認したい. このようなものをデバッグするのに何度も費やしたのに、問題がnameArrayForTextFieldArray. または、セグエ識別子の名前のタイプミス。またはそのようなランダムなもの。

これで問題ないと仮定すると、いくつかのことが可能になります。

  1. あなたのnameArray財産は でどのように定義されていGameViewControllerますか? strong参照 (またはcopy) でない場合arrayは、範囲外になると割り当てが解除されます。これは少し違った形で現れると思いますが、確認する価値があります。

  2. また、GameViewControllerさまざまな ivar とプロパティの間でコントローラが混乱している可能性がある状況を見てきました (これが、自分のプロパティに ivar を定義しない理由です... 私はそうさ@synthesizeせました)。

  3. のカスタムセッターを使用していないと思いますnameArray。確認したいだけです。もしそうなら、それも共有してください。

要するに、ステートメントだけでなくnameArray、あなた@interfaceの of でのすべての参照を示していただけますか?GameViewController@synthesize

于 2012-07-04T05:08:18.887 に答える
0

GameViewController はナビゲーション コントローラーに埋め込まれていますか? その場合、destinationViewController プロパティは、GameViewController ではなく、UINavigationController 型です。を呼び出すことで GameViewController にアクセスできます[segue.destinationViewController.viewControllers lastObject]

于 2012-07-04T04:54:39.143 に答える