web-dev-qa-db-ja.com

Xcode、セグエ識別子を割り当てる場所

初心者の質問はご容赦ください。このような別の画面(ViewController)に切り替えることができることを知っています

self.performSegueWithIdentifier ("SecondViewController", sender: self)

しかし、2番目の画面にidを割り当てる場所が見つからないようです。StoryboardIDを見つけただけです。

私はすでに試しましたが、次のエラーでクラッシュを受け取りました:

受信者()には識別子 'SecondViewController'のセグエがありません

何か案が?ありがとう

12

セグエ識別子notと同じストーリーボードID、ストーリーボードIDはその特定のストーリーボードに基づいてView Controllerを作成します(セグエ識別子とは異なり、一意でなければなりません)。

セグエの作成方法をすでに知っている場合は、この部分をスキップできます。

2つのviewControllersの間にセグエを追加:

Interface Builderから、 ctrl リンクする2つのView Controller間をドラッグします(メインビューではなく、View Controller自体からドラッグしていることを確認してください)。見るべき:

enter image description here

[表示]を選択します(たとえば)。出力は次のようになります。

enter image description here

上記のように、赤い長方形で囲まれた矢印はセグエです。

追加メモ:「表示」オプションを選択した場合、最初のView ControllerをNavigation Controllerに埋め込む必要があります(最初のviewControllerを選択-> Editor-> Embed In-> Navigation Controller)、出力は次のようになります。

enter image description here

「表示」とは、ナビゲーションコントローラースタックにプッシュすることを意味するためです。

セグエの識別子の割り当て:

セグエを選択します。属性インスペクターから「識別子」テキストフィールドが表示されます、それだけです! performSegueWithIdentifierで使用したものとまったく同じ名前を挿入してください。

属性インスペクターの場所がわからない場合、右上にあるのは次のようになります:

enter image description here


さらに:

1つのView Controllerからmultipleセグエを追加するには、同じプロセス(ctrl +最初のコントローラーから他のView Controllerにドラッグします)、出力は次のようになります。

enter image description here

この場合、どのセグエが実行されたかを認識する方法の問題に直面する可能性があります prepare(for:sender:) メソッドをオーバーライドすることが解決策であり、セグエidentifierプロパティ:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "firstSegueIdentifier") {
        // ...
    } else if (segue.identifier == "secondSegueIdentifier") {
        //...
    }
}

ストーリーボードのセグエに追加した名前になります。

27
Ahmad F

あなたのコードで

self.performSegueWithIdentifier ("SecondViewController", sender: self)

文字列「SecondViewController」は、ストーリーボードidのように見えます。同じ場所で、ストーリーボードIDではなくセグエ識別子を記述する必要があります。

スクリーンショットに従って、右上のバーフィールドでセグエをクリックしてセグエ識別子名を割り当てます。あなたはこのようにすることができます

self.performSegueWithIdentifier ("WriteSegueIdentifierName", sender: self)

enter image description here

2
Harish Singh

次のようにviewControllerを開始できます。

let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Login")
self.present(viewController, animated: false, completion: nil)
0
Abuzar Manzoor

Viewコントローラーをストーリーボード内の別のViewコントローラーにリンクする場合、それらの間のリンクではセグエ識別子、つまり「SecondViewController」のみを割り当てる必要があります。そうすればコードが機能します。

または、self.storyboard.instantiateViewControllerWithIdentifier( "// storyboard id of that view controller")を使用して、ストーリーボードIDで別のView Controllerを表示してから、present/showビューコントローラーを使用することもできます。

0
Bhavuk Jain