ビューに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)
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
}
}
あなたはそれを切り替えることができます...
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
}
}
}
segue.identifier
をセグエではない文字列と比較する必要があります。
segue.identifier == "historySegue"
問題は解決しませんが、後で役立ちます。
ブレークポイントを追加し、アプリはそれで停止したと思います。ブレークポイントを削除すると、機能します。
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)
}
}
Objective Cでさまざまなセグエをナビゲートするには、これらのアクションに従う必要があります。
コードをカスタマイズ次のように、例を示します。
-(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");
}