画面遷移はカスタムセグエを作って楽しよう!

標準的なカスタムセグエ

よく使う遷移はセグエにしておくとStoryboardから指定できてとても便利です。

class DismissSegue: UIStoryboardSegue {
    override func perform() {
        source.presentingViewController?.dismiss(animated: true)
    }
}

class PopSegue: UIStoryboardSegue {
    override func perform() {
        source.navigationController?.popViewController(animated: true)
    }
}

class PopToRootSegue: UIStoryboardSegue {
    override func perform() {
        source.navigationController?.popToRootViewController(animated: true) 
    }
}

class PushFromRootSegue: UIStoryboardSegue {
    override func perform() {
        source.navigationController?.setViewControllers([source.navigationController!.viewControllers.first!, destination], animated: true)
    }
}

class DismissKeyboardSegue: UIStoryboardSegue {
    override func perform() {
        source.view.endEditing(true)
    }
}

課金や認証が伴う遷移について

例えば、3つのページに課金のプレミアムページへ移動できるボタンを配置したい時。それぞれのViewControllerにボタンのIBActionを書いても良いのですが、セグエの方が楽に使い回しできます。

class PushToPremiumSegue: UIStoryboardSegue {
    override func perform() {
        if 課金済みなら {
            let vc = source.storyboard!.instantiateViewController(withIdentifier: “PremiumViewController”)
            source.navigationController?.pushViewController(vc, animated: true)
        }
    }
}

セグエをドラッグしてプレミアムページ(destination)へ繋がなくても良いように(単独で使えるように)してPremiumViewControllerを決め打ちで生成しています。

逆に特定のViewControllerにまつわる処理が必要な場合はセグエにしなくても良いかもしれません。セグエにするメリットは何と言っても2回目以降がコードレスになる事です。

閉じる、戻る、繋がない単独セグエ

単独で使う場合でもdestinationはnilにはならずにsourceのViewControllerの別インスタンスが入っています。