ファイル/フォルダーリストをドリルダウンするメカニズムを作成しようとしています。アイデアは、ユーザーがフォルダーを選択するたびに同じファイルリストビューコントローラーを表示し、ユーザーがファイルを選択した場合はファイル詳細ビューコントローラーを表示することです。
これまで、ファイルリストビューコントローラーからファイル詳細ビューコントローラーへのセグエと、ファイルリストテーブルビューセルからファイルリストテーブルビューコントローラーへのセグエを作成しました。
これに関する問題は、ユーザーがセルをタップするとすぐにセグエが実行されることです。テーブルビューセルからセグエを削除し、ファイルリストビューコントローラからセグエを作成します。そうすれば、ユーザーがセルをタップしたときにプログラムで正しいセグエをトリガーできます。
だから、私の質問は:Interface BuilderでView Controllerからそれ自体にセグエを作成することは可能ですか?
ファントムボタンを使用してセグエを作成する方法を開発しました。私はそれがあなたの問題を解決すると信じています。あなたは私の答えでそれについて読むことができます こちら 。
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];
Xcode 5を使用すると、muchより簡単な解決策があります。
それでおしまい。
同じコントローラーに対してセグエを実行する代わりに、ストーリーボードからビューコントローラー(同じコントローラー)をインスタンス化し、それをNavigationコントローラーにプッシュできます。
Interface Builderのアプローチ:表示するView Controllerを参照するストーリーボードの参照にセグエします。
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);
}
セグエを定義したり、独自の識別子をハードコーディングしたりせずに、現在のView Controllerの別のインスタンスをプッシュする方法は次のとおりです。
SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];
復元IDをストーリーボードIDと同じに設定するだけです(IBにはチェックボックスがあります)。
お役に立てれば。
複数のプロトタイプセルを作成できることがわかりました。
ストーリーボード内のすべてのセルを別のビューにリンクできます。
このようなもの:
NSString *CellIdentifier = @"Cell";
if (Condition2 ){
CellIdentifier = @"Cell2"; }
if (Condition3 ){
CellIdentifier = @"Cell3"; }