我有一个 13 行的函数,在我的应用程序中的每个 ViewController 中重复,整个项目总共有 690 行代码!
/// Adds Menu Button
func addMenuButton() {
let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
let menuImage = UIImage(named: "MenuWhite")
menuButton.setImage(menuImage, for: .normal)
menuButton.addTarget(self, action: #selector(menuTappedAction), for: .touchDown)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButton)
}
/// Launches the MenuViewController
@objc func menuTappedAction() {
coordinator?.openMenu()
}
为了使 menuTappedAction 函数起作用,我必须像这样声明一个弱变量:
extension UIViewController {
weak var coordinator: MainCoordinator?
但是这样做我得到错误
Extensions must not contain stored properties
到目前为止我尝试了什么:1) 删除
weak
关键字会在我的所有应用程序中引起冲突。2)以这种方式声明:
weak var coordinator: MainCoordinator?
extension UIViewController {
将使错误静音,但协调器不会执行任何操作。任何建议如何解决这个问题?
最佳答案
您可以移动您的addMenuButton()
对具有协议(protocol)扩展的协议(protocol)起作用。例如:
@objc protocol Coordinated: class {
var coordinator: MainCoordinator? { get set }
@objc func menuTappedAction()
}
extension Coordinated where Self: UIViewController {
func addMenuButton() {
let menuButton = UIButton(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
let menuImage = UIImage(named: "MenuWhite")
menuButton.setImage(menuImage, for: .normal)
menuButton.addTarget(self, action: #selector(menuTappedAction), for: .touchDown)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButton)
}
}
很遗憾,您无法添加
@objc
类扩展的方法(见:this stackoverflow question),所以你仍然需要像这样设置你的 View Controller :class SomeViewController: UIViewController, Coordinated {
weak var coordinator: MainCoordinator?
/// Launches the MenuViewController
@objc func menuTappedAction() {
coordinator?.openMenu()
}
}
它会为你节省一些代码,它会让你重构更大的函数
addMenuButton()
.希望这可以帮助!
关于swift - "Extensions must not contain stored properties"阻止我重构代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944431/