Создание селектора с переменной типа функции - PullRequest
0 голосов
/ 16 января 2019

Я работаю над двумя представлениями, которые являются подклассами подкласса UITableViewCell. В базовом классе (подкласс UITableViewCell) я пытаюсь настроить распознаватель жестов таким образом, чтобы каждый из суперклассов мог изменить поведение (в конце концов, вызовите метод didTapped для своего делегата) касания.

Я написал следующий код. Я могу использовать #selector(tap), однако я думаю, что использование переменной вместо переопределения метода tap в каждом суперклассе - намного более чистый способ. Можно ли даже использовать что-то вроде #selector(tapFunc)? Если нет, то какое будет самое чистое и лучшее с технической точки зрения решение?

class BaseCell: UITableViewCell {

    @objc var tapFunc: () -> () = { () in
        print("Tapped")
    }

    @objc func tap() {
        print("TEST")
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tapFunc))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}

А затем два представления, которые строятся поверх этого:

class ViewA: BaseCell {

    //don't want to do this
    override func tap() {
        //do stuff
    }

    func setup {
        //setup everything else
    }

class ViewB: BaseCell {

   var delegate: ViewBProtocool?

    func setup {
        tapFunc = { () in
            delegate?.didTapped(self)
        }
        //setup everything else
    }

1 Ответ

0 голосов
/ 16 января 2019

Ты не слишком далеко. Сделайте следующие изменения:

class BaseCell: UITableViewCell {
    var tapFunc: (() -> Void)? = nil

    // Called by tap gesture
    @objc func tap() {
        tapFunc?()
    }

    func setupBasicViews(withContent: () -> ()) {

        let tapGestureRecoginzer = UITapGestureRecognizer(target: self, action: #selector(tap))
        contentView.isUserInteractionEnabled = true
        contentView.addGestureRecognizer(tapGestureRecoginzer)
    }
}

class ViewA: BaseCell {
    func setup() {
        //setup everything else
    }
}

class ViewB: BaseCell {
    var delegate: ViewBProtocol?

    func setup() {
        tapFunc = {
            delegate?.didTapped(self)
        }
        //setup everything else
    }
}

Теперь каждый подкласс может дополнительно обеспечивать закрытие для свойства tapFunc.

Я показываю выше, что tapFunc является необязательным без функциональности по умолчанию в базовом классе. Не стесняйтесь изменить это, чтобы обеспечить некоторую функциональность по умолчанию при желании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...