web-dev-qa-db-ja.com

Swift:2つの異なるセグエを使用したprepareForSegue

ビューに2つのUIButtonsがあります。それらのそれぞれは、2つの異なるビューにリンクされています。タップしたボタンに応じて、異なるデータを渡す必要があります。

segueにはさまざまな方法があることは知っていますが、それぞれにprepareForSegueバージョンを使用したいと思います(ストーリーボードといくつかのコードにsegueを描画する方が明確なようです何が起こったのかを説明するため)。

私はこれを試しました...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue != "historySegue") {
        let controller = segue.destinationViewController as! ResultViewController
        controller.match = self.match
    } else {
        let controller = segue.destinationViewController as! HistoryViewController
        controller.history = self.history
    }
}


@IBAction func showHistory(sender: UIButton) {
    performSegueWithIdentifier("historySegue", sender: self)
}

@IBAction func match(sender: UIButton) {
    performSegueWithIdentifier("matchSegue", sender: self)
}

しかし、ボタンをクリックするとエラーが発生しました

(lldb)

10
Ragnar

IBActionsを取り出します(InterfaceBuilderの右側のサイドバーとコードを介してConnectionsInspectorでそれらを削除してください)。セグエの場合は、Interface Builderを使用し、両方のセグエの識別子が正しいことを確認してから、次のprepareForSegueメソッドを試してください。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "matchSegue" {
        let controller = segue.destinationViewController as! ResultViewController
        controller.match = self.match
    } else if segue.identifier == "historySegue" {
        let controller = segue.destinationViewController as! HistoryViewController
        controller.history = self.history
    }
}
21
Rachel Harvey

あなたはそれを切り替えることができます...

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {
        switch identifier {
        case "matchSegue":
            let controller = segue.destinationViewController as! ResultViewController
            controller.match = self.match
        case "historySegue":
            let controller = segue.destinationViewController as! HistoryViewController
            controller.history = self.history
        }
    }
}
4
Fogmeister

segue.identifierをセグエではない文字列と比較する必要があります。

segue.identifier == "historySegue"

問題は解決しませんが、後で役立ちます。

ブレークポイントを追加し、アプリはそれで停止したと思います。ブレークポイントを削除すると、機能します。

1
Greg

2つの異なるセグエを持つprepareForSegueボタンをクリックすると、uialertコントローラーに3つのオプションが表示されます1 。物理的、2。オンライン、3。キャンセル。

@objc func twoSegues(sender : UIButton) {
let alert = UIAlertController(title: "Update Request", message: "Are you sure to update the record!", preferredStyle: .alert)
        let yes = UIAlertAction(title: "Yes", style: .default, handler: { [weak self] (UIAlertAction) in

            if(serviceType == "physical") {
                DispatchQueue.main.async {
                    self?.performSegue(withIdentifier: "physical", sender: self?.myArray[id!].serviceID)


                 }
            }
             if(serviceType == "online") {
                DispatchQueue.main.async {
                    self?.performSegue(withIdentifier: "online", sender: self?.myArray[id!].serviceID)
                 }
            }
        })
        let no = UIAlertAction(title: "No", style: .default, handler: nil)
        alert.addAction(yes)
        alert.addAction(no)

        self.present(alert, animated: true, completion: nil)
    }
}
0
Akbar Khan

Objective Cでさまざまなセグエをナビゲートするには、これらのアクションに従う必要があります。

  1. 実際のセグエをクリックストーリーボード上
  2. 属性インスペクターに移動し、識別子の名前を変更セグエの
  3. コードをカスタマイズ次のように、例を示します。

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"segueNumberOne"]){
        YourViewController *functionalityViewController = [segue destinationViewController];
        functionalityViewController.someProperty = someValue;
        NSLog(@"move to segue number 1");
    }else if ([segue.identifier isEqualToString:@"segueNumberTwo"]){
        NSLog(@"move to segue number 2");
    }
    
0
avivamg