Обычно у нас есть предопределенный набор UIBarButtonItem
в проекте, который можно использовать в проекте и несколько раз, как левая кнопка меню, чтобы открыть боковое меню, его можно использовать в разных UIViewController
и кнопку закрытия которые отклоняют представленный контроллер представления.
Классический способ состоит в том, чтобы добавлять эти кнопки по мере необходимости, но это приводит к дублированию кода, и мы все хотим этого избежать.
Я придумал подход, но это далеко не идеальный:
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)
}
}
а затем использование:
override func viewDidLoad() {
super.viewDidLoad()
self.add(barButtons: [.close], position: .right)
self.add(barButtons: [.menu], position: .left)
}
Ограничения моего подхода:
-
Расширение должно знать, как создать экземпляр нового контроллера представлений (например, случай уведомления), и что, если viewController должен быть включен с параметрами
-
Предполагается, что вы хотите только представить
UIViewController
-
Не элегантный.
Я уверен, что есть лучший способ с языком программирования Swift и протоколом, который может достичь намеченного результата с большей гибкостью, любыми мыслями?