Xebia Blog

ストーリーボードでセグを使用することの欠点の1つは、ソースビューコントローラから宛先ビューコントローラへデータを渡すコードを書く必要がしばしばあることである。 prepareForSegue(_:sender:) メソッドは、これを行うための適切な場所です。 時には、performSegueWithIdentifier(_:sender:)を呼び出して手動でセグエを起動する必要がありますが、通常はそこで、どのデータを渡す必要があるかが分かります。 データを渡すためだけに、ソースビューコントローラに余分なステート変数を追加しないようにするには、どうしたらよいでしょうか。

Update:
Please keep mind that this is considered an anti-pattern as commented by some reader below, this post is meant to explore the possibilities of segues, which does not mean you should always use it, but it’s not used. 2010>

送信者パラメーターは通常、ストーリーボードで、セグエをトリガーした UI 要素、たとえば、押されたときの UIButton や選択することによってセグエをトリガーする UITableViewCell を示すために使用されます。 これにより、prepareForSegue:sender:で何がセグエをトリガーしたかを判断し、それに基づいて(もちろんセグエ識別子も)何らかのアクションを行い、目的のビューコントローラを設定したり、shouldPerformSegueWithIdentifier(_:sender:)で false を返してセグエをまったく実行しないように判断したりすることができるようになりました。

ストーリーボード内の UI エレメントからセグエをトリガーできない場合、代わりに performSegueWithIdentifier(_:sender:) を使用して手動でトリガーする必要があります。 これは、コードで作成されたいくつかのコントロールのアクションをトリガーするために、直接的なユーザーインタラクションがない場合に起こるかもしれません。 例えば、ボタンを押したときに追加のロジックを実行し、その後にセグエを実行したい場合です。 どのような状況であれ、sender引数を利用することで利益を得ることができます。 prepareForSegue(_:sender:) または shouldPerformSegueWithIdentifier(_:sender:) で必要なものを渡すことができます。

いくつかの例を見てみましょう。 1 つ目は、異なる色の 3 つのボタンがあります。 いずれかのボタンをタップすると、選択された色の名前がラベルに表示され、2番目のビューコントローラをプッシュします。 押されたビューコントローラは、その背景色を、タップされたボタンが表す色に設定します。

これは、ボタンから目的のビュー コントローラーに直接 3 つの異なるセグエを作成することによって処理できるにもかかわらず、私たちはボタンのタップを自分で処理し、手動でセグエをトリガーすることを選択しました。 UIViewController {

@IBOutlet weak var label: UILabel!

var tappedColor: UIColor?

@IBAction func tappedRed(sender: AnyObject) {
label.text = “Tapped Red”
tappedColor = UIColor.redColor()
performSegueWithIdentifier(“ShowColor”, sender: sender)
}

@IBAction func tappedGreen(sender: AnyObject) {
label.text = “Tapped Green”
tappedColor = UIColor.ShowColor(){
ラベルをタップした緑(tappedGreen)
tappedColor = UIColor.greenColor()
performSegueWithIdentifier(“ShowColor”, sender: sender)
}

@IBAction func tappedBlue(sender: AnyObject) {
label.text = “Tapped Blue”
tappedColor = UIColor.Green”
タップした色”
tappedColor = UIColor.Blue”
タップした青(TappedBlue)blueColor()
performSegueWithIdentifier(“ShowColor”, sender: sender)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == “ShowColor” {
if let colorViewController = segue.destinationViewController as? ColorViewController {
colorViewController.color = tappedColor
}
}

}

class ColorViewController.ColorViewController。 UIViewController {

var color: UIColor?

override func viewDidLoad() {
super.viewDidLoad()

view.backgroundColor = color
}

}

tappedColor というステート変数を作成して渡すべき色を記録しています。 これは、performSegueWithIdentifier(“ShowColor”, sender: sender) を呼び出す前に各アクション メソッドで設定され、prepareForSegue( _:sender:) で再度読み込まれて、目的のビュー コントローラに渡すことができます。

アクション メソッドは、タップした UIButtons が送信者引数に設定されていて、これはアクションを開始した実際の要素なので、セグの実行時にそれを送信者として設定することが理にかなっていると言えます。 というわけで、上記のコードではそのようにしています。 しかし、実際にはセグエを準備するときに sender を使用しないので、代わりに色を直接渡す方がよいでしょう。 以下は、まさにそれを行う ViewController の新しいバージョンです。

class ViewController: UIViewController {

@IBOutlet weak var label: UILabel!

@IBAction func tappedRed(sender: AnyObject) {
label.text = “Tapped Red”
performSegueWithIdentifier(“ShowColor”, sender.ShowColor”、”ShowColor”、”ShowColor”、”ShowColor”) {
ラベルの色を変更する。 UIColor.redColor())
}

@IBAction func tappedGreen(sender: AnyObject) {
label.text = “Tapped Green”
performSegueWithIdentifier(“ShowColor”, sender.UIC Color”, sender: UIColor.greenColor())
}

@IBAction func tappedBlue(sender: AnyObject) {
label.text = “Tapped Blue”
performSegueWithIdentifier(“ShowColor”, sender.UIColor(), “ShowColor”) {ラベルをタップした青”
performSegueWithIdentifier(“表示色”, sender: UIColor.blueColor())
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == “ShowColor” {
if let colorViewController = segue.destinationViewController as? ColorViewController {
colorViewController.color = sender as? UIColor
}
}

}

これにより、余分な tappedColor 変数を取り除くことができます。

ただし、sender パラメータを乱用しているように見える(そしておそらくそうなる)ので、適切な場合にのみ注意して使用するようにしてください。 他のコードまたはストーリーボード内の要素が同じセグエをトリガーする場合 (つまり、同じ識別子で)、sender は期待したオブジェクトではなく UI 要素になる可能性があり、sender をそうでないものに強制キャストすると、予想外の結果やクラッシュにつながる可能性もあります。

Xcode プロジェクト形式のサンプル コードは https://github.com/lammertw/SegueColorSample にあります。

このトピックについてもっと知りたいですか。
以下のコンサルティング サービス、トレーニング提供、採用情報をご覧になるか、[email protected]

までお問い合わせください。

コメントを残す

メールアドレスが公開されることはありません。