Storyboardを使えば簡単だが、こんな時はどうする!?
こんな感じで、Storyboardを使えば簡単にポップオーバーが実現できます。
良いUIかどうかの議論は別として、状況によってポップオーバーする内容を変えたい場合があったとします。
Storyboardではボタン1つに対して、1つのポップオーバーしか指定できません。
このような場合は、ソースコードで状況に応じたポップオーバーはどれかを判断し、用意しておいた複数のStoryboardからオブジェクトを生成して表示する
というのが現実的でしょう。
二つのStoryboardを用意する
CSetting
とCSubSetting
という二つのStoryboardを用意しました。
この2つのStoryboardをソースコードで状況を判断し、その状況に応じて表示します。
Sub Setting
のスイッチがONの時はCSubSettingView
を採用します。
Sub Setting
のスイッチがOFFの時はCSettingView
を採用します。
extension ViewController {
@IBAction func settingButton(_ sender: Any) {
let vc: UIViewController
if subSettingSw.isOn {
vc = UIStoryboard(name: "CSubSettingView", bundle: nil).instantiateInitialViewController()!
} else {
vc = UIStoryboard(name: "CSettingView", bundle: nil).instantiateInitialViewController()!
}
vc.modalPresentationStyle = .popover
vc.popoverPresentationController?.sourceView = (sender as! UIButton).superview
vc.popoverPresentationController?.sourceRect = (sender as! UIButton).frame
present(vc, animated: true)
}
}
UIViewControllerをStoryboardから取得し、UIViewControllerのプロパティを必要に応じて設定します。
あとはpresetntメソッドで表示します。
こんな感じで、スイッチの状態に応じて表示するPopoverを変えることができました。