iOS (Swift): протокол для UIViewController, который добавляет новый объект - PullRequest
0 голосов
/ 01 июня 2018

У меня есть контроллер представления, который отвечает за добавление нового объекта, скажем, нового контакта.Этот контроллер вида (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 или, если это даже правильный способgo.

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 голосов
/ 01 июня 2018

Вы можете просто настроить 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 runtime для разрешенияпроблема.Попробуйте реализовать его на своем конце и проверьте, работает ли он для вас.

...