web-dev-qa-db-ja.com

View Controllerからそれ自体へのストーリーボードセグエ

ファイル/フォルダーリストをドリルダウンするメカニズムを作成しようとしています。アイデアは、ユーザーがフォルダーを選択するたびに同じファイルリストビューコントローラーを表示し、ユーザーがファイルを選択した場合はファイル詳細ビューコントローラーを表示することです。

これまで、ファイルリストビューコントローラーからファイル詳細ビューコントローラーへのセグエと、ファイルリストテーブルビューセルからファイルリストテーブルビューコントローラーへのセグエを作成しました。

enter image description here

これに関する問題は、ユーザーがセルをタップするとすぐにセグエが実行されることです。テーブルビューセルからセグエを削除し、ファイルリストビューコントローラからセグエを作成します。そうすれば、ユーザーがセルをタップしたときにプログラムで正しいセグエをトリガーできます。

だから、私の質問は:Interface BuilderでView Controllerからそれ自体にセグエを作成することは可能ですか?

74
Jorge

ファントムボタンを使用してセグエを作成する方法を開発しました。私はそれがあなたの問題を解決すると信じています。あなたは私の答えでそれについて読むことができます こちら

26
T.J.

Navigation Controllerを使用している場合、ViewControllerをnavスタックにプッシュする必要があります。この例では、ストーリーボードID設定でViewControllerに「VDI」という名前を付けました。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

NavigationControllerを「戻る」履歴に追加し続けたくない場合は、そのように追加する前にスタックをポップできます。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];
43
Jim True

Xcode 5を使用すると、muchより簡単な解決策があります。

  1. ストーリーボードの表のセルをクリックします
  2. 接続インスペクターを開きます(右上の右矢印アイコン)
  3. 「トリガーされたセグエ」の下に「選択」が表示されます
  4. 「選択」の横の円からストーリーボードのセルにドラッグします

それでおしまい。

30
John Henckel

同じコントローラーに対してセグエを実行する代わりに、ストーリーボードからビューコントローラー(同じコントローラー)をインスタンス化し、それをNavigationコントローラーにプッシュできます。

23
Mustafa

Interface Builderのアプローチ:表示するView Controllerを参照するストーリーボードの参照にセグエします。

15

IOS 6、ファントムボタンを使用するよりも クリーナーソリューション があります。テーブルセルからView Controllerにセグエを定義して、自動的にトリガーされたセグエをキャンセルする送信者:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}
13
Chris

正しい答えは、自分自身にセグエしたいUIViewControllerを参照しているストーリーボードリファレンスを使用し、セグエにそれを向けることです。

enter image description here

11
Sethmr

セグエを定義したり、独自の識別子をハードコーディングしたりせずに、現在のView Controllerの別のインスタンスをプッシュする方法は次のとおりです。

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

復元IDをストーリーボードIDと同じに設定するだけです(IBにはチェックボックスがあります)。

Restoration ID

4
Tomas Andrle

お役に立てれば。

複数のプロトタイプセルを作成できることがわかりました。

ストーリーボード内のすべてのセルを別のビューにリンクできます。

このようなもの:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
0
Yari