我有一个视图控制器,负责添加一个新对象,比如一个新的联系人。此视图控制器(AddContactViewController
)在UIBarButtonItem
上具有以下UINavigationBar
,这是禁用的开始,直到提供足够的信息来启用它。然后,当按下此按钮时,将调用方法(doneButtonPressed
)。
布局如下:
class AddContactViewController: UIViewController {
@IBOutlet weak var doneButton: UIBarButtonItem! {
didSet {
doneButton.isEnabled = false
doneButton.target = self
doneButton.action = #selector(self.doneButtonPressed)
}
}
@objc fileprivate func doneButtonPressed() {
// do some stuff ...
self.dismiss(animated: false, completion: nil)
}
}
由于这是一个非常普遍的事情,并且有大量的锅炉板代码,我一直致力于协议AddingHandler
,但还没有找到解决方法将UIBarButtonItem
作为weak
变量连接到storboard,或者这是否是正确的方法。
protocol AddingHandler {
var doneButton: UIBarButtonItem? { get set }
func doneButtonPressed()
}
extension protocol where Self: UIViewController {
func configureDoneButton() {
doneButton.isEnabled = false
doneButton.target = self
doneButton.action = #selector(self.doneButtonPressed)
}
}
非常感谢任何有关这项工作的帮助或评论。
问题如何最好将weak
UIButton
添加到协议中,然后可以将其连接到UIViewController
实现它的故事板中?由于这里有很多重复的代码,我希望有另一个AddSomethingViewController
我想知道是否有一种更简单的方式只写一次(在带扩展的协议中)然后在任何视图控制器中调用协议这是一个新的东西......
答案 0 :(得分:0)
您只需在doneButton
viewDidLoad()
即可
override func viewDidLoad()
{
super.viewDidLoad()
doneButton.isEnabled = false
doneButton.target = self
doneButton.action = #selector(self.doneButtonPressed)
}
修改1:
@objc protocol AddingHandler
{
var doneButton: UIBarButtonItem? { get }
@objc func doneButtonPressed()
}
extension AddingHandler where Self: UIViewController
{
func configureDoneButton()
{
doneButton?.isEnabled = false
doneButton?.target = self
doneButton?.action = #selector(doneButtonPressed)
}
}
class AddContactViewController: UIViewController, AddingHandler
{
@IBOutlet weak var doneButton: UIBarButtonItem!
override func viewDidLoad()
{
super.viewDidLoad()
configureDoneButton()
}
func doneButtonPressed()
{
// do some stuff ...
self.dismiss(animated: false, completion: nil)
}
}
我使用ObjC运行时来解决问题。尝试在你的最后实现它并检查它是否适合你。