【发布时间】:2018-02-23 14:55:55
【问题描述】:
通常我们在项目中有一组预定义的UIBarButtonItem,可以在项目中多次使用,如左菜单按钮打开侧边菜单,可以在不同的UIViewControllers中使用也可以关闭关闭呈现的视图控制器的按钮。
经典的方法是根据需要添加这些按钮,但这会引入代码重复,我们都希望避免这种情况。
我想出了一个方法,但它远非完美:
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)
}
我的方法的局限性是:
扩展需要知道如何实例化新的视图控制器(例如通知的情况)以及如果必须用参数初始化视图控制器会怎样
假设您只想展示
UIViewController不优雅。
我确信 Swift 语言和面向协议的编程有更好的方法可以更灵活地实现预期结果,有什么想法吗?
【问题讨论】:
标签: ios swift uinavigationcontroller uibarbuttonitem uinavigationitem