iOS(Swift):UIViewController的协议,用于添加新对象

时间:2018-06-01 12:03:21

标签: ios swift uiviewcontroller uibarbuttonitem

我有一个视图控制器,负责添加一个新对象,比如一个新的联系人。此视图控制器(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我想知道是否有一种更简单的方式只写一次(在带扩展的协议中)然后在任何视图控制器中调用协议这是一个新的东西......

1 个答案:

答案 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运行时来解决问题。尝试在你的最后实现它并检查它是否适合你。