回答:
定義上、セグエはストーリーボードとは別に存在することはできません。クラスの名前にも含まれています:UIStoryboardSegue
。プログラムでセグエを作成するのではなく、セグエを作成するのはストーリーボードランタイムです。通常performSegueWithIdentifier:
、ビューコントローラーのコードで呼び出すことができますが、これは、参照するためにストーリーボードにセグエが既に設定されていることに依存しています。
新しいビューコントローラーに移行し、すべての派生クラスによって継承される、共通のビューコントローラー(基本クラス)でメソッドを作成する方法について、私はあなたが尋ねていると思います。これを行うには、基本クラスのビューコントローラーに次のようなメソッドを作成します。
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
次に、派生クラスで、適切なボタンがクリックされたとき、またはテーブルの行が選択されたときに、そのメソッドを呼び出します。
UIViewController
指定さperformSegueWithIdentifier:sender:
れたメソッドを使用します。
私は別の可能性を追加すると思いました。実行できることの1つは、アクションに接続されていないセグエを使用してストーリーボードの2つのシーンを接続し、ビューコントローラー内でプログラム的にセグエをトリガーすることです。これを行う方法は、ストーリーボードシーンの下部にあるファイルの所有者アイコンから、別のシーンであるシーンをドラッグして、目的のシーンに右ドラッグする必要があることです。説明に役立つように画像を入れます。
「Manual Segue」のポップアップが表示されます。タイプとしてプッシュを選択しました。小さな正方形をタップして、属性インスペクターにいることを確認してください。コードで参照するために使用する識別子を指定します。
では、プログラムによるバーボタンアイテムを使用してセグエを作成します。viewDidLoadまたはその他の場所で、次のコードを使用してナビゲーションバーにボタン項目を作成します。
UIBarButtonItem *buttonizeButton = [[UIBarButtonItem alloc] initWithTitle:@"Buttonize"
style:UIBarButtonItemStyleDone
target:self
action:@selector(buttonizeButtonTap:)];
self.navigationItem.rightBarButtonItems = @[buttonizeButton];
OK、セレクターがbuttonizeButtonTap:であることに注意してください。そのボタンのvoidメソッドを記述し、そのメソッド内で次のようにセグエを呼び出します。
-(void)buttonizeButtonTap:(id)sender{
[self performSegueWithIdentifier:@"Associate" sender:sender];
}
prepareForSegueが呼び出されたときにボタンを識別するには、senderパラメーターが必要です。prepareForSegueは、シーンをインスタンス化し、作業に必要な値を渡すフレームワークメソッドです。私のメソッドは次のようになります:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"Associate"])
{
TranslationQuizAssociateVC *translationQuizAssociateVC = [segue destinationViewController];
translationQuizAssociateVC.nodeID = self.nodeID; //--pass nodeID from ViewNodeViewController
translationQuizAssociateVC.contentID = self.contentID;
translationQuizAssociateVC.index = self.index;
translationQuizAssociateVC.content = self.content;
}
}
OK、テストしただけで動作します。お役に立てば幸いです。
このコードを使用して、カスタムセグエサブクラスをインスタンス化し、プログラムで実行しました。動作するようです。これに問題はありますか?私は困惑し、他のすべての答えを読むことができません。
UIViewController *toViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"OtherViewControllerId"];
MyCustomSegue *segue = [[MyCustomSegue alloc] initWithIdentifier:@"" source:self destination:toViewController];
[self prepareForSegue:segue sender:sender];
[segue perform];
UIStoryboardSegue
。
performSegueWithIdentifier:
がストーリーボードで本当に定義されているかどうかのコンパイル時のチェックはありません。セグエを自分で作成すれば、すべての問題を回避できます。
これは答えられて受け入れられると思いますが、もう少し詳細を追加したいと思います。
ログインビューを最初の画面として表示し、ログインが正しい場合はアプリケーションに代行したいという問題を解決するために私がしたこと ログインビューコントローラーからルートビューコントローラーへのセグエを作成し、「myidentifier」のような識別子を付けました。
次に、すべてのログインコードをチェックした後、ログインが正しいかどうかを呼び出します
[self performSegueWithIdentifier: @"myidentifier" sender: self];
私の最大の誤解は、セグエをボタンに配置し、それが見つかるとすぐにセグエを中断しようとしたことでした。
UIStoryboard
使用しているにコードをリンクする必要があります。でYourViewControllerにUIStoryboard
移動し、その周囲の境界線をクリックして、そのidentifier
フィールドをNSString
コードで呼び出すに設定してください。
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
YourViewController *yourViewController =
(YourViewController *)
[storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerID"];
[self.navigationController pushViewController:yourViewController animated:YES];
ストーリーボードにあるコントローラーの場合。
jhilgert00はあなたが探していたものですか?
-(IBAction)nav_goHome:(id)sender {
UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
[self.navigationController pushViewController: myController animated:YES];
}
または...
[self performSegueWithIdentifier:@"loginMainSegue" sender:self];
まあ、UIStoryBoardSegueを作成してサブクラス化することもできます。サブクラス化は、主にカスタム遷移アニメーションを提供するために使用されます。
StoryBoardを紹介するwwdc 2011のビデオを見ることができます。YouTubeでも利用できます。
説明を追加したい...
よくある誤解は、事実、私がしばらくの間経験したことですが、ストーリーボードセグエはprepareForSegue:sender:
メソッドによってトリガーされるというものです。そうではない。ストーリーボードセグエはprepareForSegue:sender:
、その(ビューコントローラから離れた)メソッドを実装しているかどうかに関係なく実行されます。
これはPaul Hegartyの素晴らしいiTunesU講義から学びました。申し訳ありませんが、残念ながらどの講義か思い出せません。
ストーリーボードの2つのView Controller間にセグエを接続するが、実装しない場合 prepareForSegue:sender:
メソッドを場合でも、セグエはターゲットのビューコントローラーにセグエします。ただし、準備されていないビューコントローラーにセグメンテーションします。
お役に立てれば。
ストーリーボードセグエは、ストーリーボードの外で作成することはできません。欠点はあるものの、配線する必要があります。
UIStoryboardSegueリファレンスは明確に述べています:
セグエオブジェクトを直接作成することはありません。代わりに、ストーリーボードランタイムは、2つのView Controller間でセグエを実行する必要がある場合にそれらを作成します。必要に応じて、UIViewControllerのperformSegueWithIdentifier:sender:メソッドを使用してプログラムでセグエを開始することもできます。プログラムで追加されたためにInterface Builderで使用できないソースからセグエを開始するためにそうするかもしれません。
プログラムでストーリーボードにセグエを使用して、presentModalViewController:
またはpushViewController:animated:
呼び出しを使用してビューコントローラーを表示するように指示できますが、ストーリーボードインスタンスが必要になります。
UIStoryboard
sクラスメソッドを呼び出して、メインバンドルのバンドルnilで名前付きストーリーボードを取得できます。
storyboardWithName:bundle:
最初に、ストーリーボードに2つの異なるビューがあり、1つの画面から別の画面に移動する場合は、次の手順に従います。
1)。IDインスペクターでクラスファイルとストーリーボードIDを使用してすべてのビューを定義します。
2)。ナビゲーションコントローラを最初のビューに必ず追加してください。ストーリーボードでそれを選択してから、エディター>埋め込み>ナビゲーションコントローラー
3)。最初のクラスで、「secondClass.h」をインポートします
#import "ViewController.h
#import "secondController.h"
4)。セグエを実行する必要があるIBActionにこのコマンドを追加します
secondController *next=[self.storyboard instantiateViewControllerWithIdentifier:@"second"];
[self.navigationController pushViewController:next animated:YES];
5)。@"second"
secondviewコントローラークラス、ストーリーボードIDです。
self.storyboard
する必要があります:UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
storyboardWithName:@"Main"
[self showDetailViewController:next sender:self];
or を使用して次のビューを表示することもできます[self showViewController:next sender:self];
私はリバースエンジニアリングを行い、UIStoryboardのセグエのオープンソース(再)実装を作成しました:https : //github.com/acoomans/Segway
そのライブラリを使用すると、セグエをプログラムで(ストーリーボードなしで)定義できます。
お役に立てれば幸いです。
のコードサンプルはCreating a segue programmatically
次のとおりです。
class ViewController: UIViewController {
...
// 1. Define the Segue
private var commonSegue: UIStoryboardSegue!
...
override func viewDidLoad() {
...
// 2. Initialize the Segue
self.commonSegue = UIStoryboardSegue(identifier: "CommonSegue", source: ..., destination: ...) {
self.commonSegue.source.showDetailViewController(self.commonSegue.destination, sender: self)
}
...
}
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// 4. Prepare to perform the Segue
if self.commonSegue == segue {
...
}
...
}
...
func actionFunction() {
// 3. Perform the Segue
self.prepare(for: self.commonSegue, sender: self)
self.commonSegue.perform()
}
...
}
self.prepare(for: self.commonSegue, sender: self)
アクションメソッドから呼び出しています。if self.commonSegue == segue {...}
では、prepare(for:sender)
メソッドで比較する意味は何ですか?
prepare(for:sender:)
、宛先のView Controllerを表示する前に構成できます。もちろん、でも行うことができますactionFunction
。