web-dev-qa-db-ja.com

performSegueWithIdentifierとinstantiateViewControllerWithIdentifier

このSIGABRTを手に入れられないようです。私はこのストーリーボードiOSアプリケーションを持っており、ストーリーボードにはUITableViewControllerがあります。これで、TVCのセルを取得して、「segue」ビューコントローラーをプッシュすることができますが、特定の条件で「segue」アクションを停止する必要がある場合はどうなりますか? prepareForSegue:sender:メソッドでは許可されていないため、どうやらできません。遷移が実行されようとしているときに呼び出されるコールバックはこれだけのようです。

そのため、tableView:didSelectRowAtIndexPath:に移動して、プログラムでセグエを実行できると思いました。最適ではありませんが、それでも…

まあ、それは私が間違って推測したことが判明しました。または少なくとも、私は何か間違ったことをしています。それを行う最も明白な方法は

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"TheOtherIdentifier" sender:self];
}

しかし、アプリ全体がSIGABRTでクラッシュし、有用な情報が提供されません(そして、そうです、アプリをクラッシュさせるのはその行であると確信しています。デバッガーで確認しました:)さらに、VC次のコードがあるため、ロードしようとしていますが、識別子が正しく設定されています

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"TheOtherIdentifier"];
    [self.navigationController pushViewController:vc animated:YES];
}

「機能する」。引用符は、これが明らかにそのような移行を実行する方法ではないことを示しています。

今:アイデア?

16
Morpheu5

これを試して:

  1. 2番目ではなく最初のコードブロックを使用します。
  2. ストーリーボードコントロールで、セルから他のビューコントローラーにドラッグします。セグエが作成されることに注意してください。
  3. セグエをクリックします。属性インスペクタを使用して、セグエと識別子に「theOtherIdentifier」(小文字の「t」を推奨)を指定します。また、ナビゲーションコントローラーを使用していると仮定して、「プッシュ」のセグエスタイルを選択します。
  4. ストーリーボードは他のビューコントローラをインスタンス化します。コードでこれを実行していないことを確認してください。
8
T.J.