通常、プロジェクトにはの定義済みセットがあります。このセットはプロジェクトで使用でき、左側メニューボタンのように複数回使用して、表示されたビューコントローラを閉じる閉じるボタンでも異なって使用することができます。一般的なグローバルなエレガントな方法プロジェクトの任意のUIViewControllerにバーボタンアイテムを追加する
古典的なやり方は、必要に応じてこれらのボタンを追加することですが、これはコードの重複を導入し、私たちは皆それを避けたいと考えています。
アプローチを思い付くが、それははるかに完璧であることからのマイ:私のアプローチの限界がある
override func viewDidLoad() {
super.viewDidLoad()
self.add(barButtons: [.close], position: .right)
self.add(barButtons: [.menu], position: .left)
}
:
-
enum BarButtonItemType { case menu, close, notification } enum BarButtonItemPosition{ case right, left } extension UIViewController { func add(barButtons:[BarButtonItemType], position: BarButtonItemPosition) { let barButtonItems = barButtons.map { rightBarButtonType -> UIBarButtonItem in switch rightBarButtonType { case .menu: return UIBarButtonItem(image: UIImage(named:"menu"), style: .plain, target: self, action: #selector(presentLeftMenu(_:))) case .notification: return UIBarButtonItem(image: UIImage(named:"notification"), style: .plain, target: self, action: #selector(showNotification(_:))) case .close: return UIBarButtonItem(image: UIImage(named:"close"), style: .plain, target: self, action: #selector(dismissController(_:))) } } switch position { case .right: self.navigationItem.rightBarButtonItems = barButtonItems case .left: self.navigationItem.leftBarButtonItems = barButtonItems } } // MARK: Actions @objc fileprivate func presentLeftMenu(_ sender:AnyObject) { self.parent?.presentLeftMenuViewController(sender) } @objc fileprivate func dismissController(_ sender:AnyObject) { self.dismiss(animated: true, completion: nil) } @objc fileprivate func showNotification(_ sender:AnyObject) { let notificationViewController = UINavigationController(rootViewController:NotificationViewController()) self.present(notificationViewController, animated: true, completion: nil) } }
、その後の使用
拡張機能は、新しいView Controllerをインスタンス化する方法(たとえば、通知の場合)と、ビューコントローラは、それはあなただけ
UIViewController
ないエレガントを提示することを想定していたパラメータ
でinitedする必要があります。
私は、より柔軟に任意の考えを意図した結果を達成することができます指向プログラミング言語スウィフトとプロトコルとのより良い方法があることを確信していますか?