Выберите и отмените выбор многоразовых просмотров - PullRequest
0 голосов
/ 20 июня 2019

Я создаю собственное представление в xib-файле.Я добавляю 3 вида (которые унаследованы от пользовательских) в viewController.Изначально они имеют белый цвет, но когда я нажимаю на первый вид, он должен быть изменен на другой цвет, и если я нажимаю на второй вид, первый вид должен вернуться в белый цвет.

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

Мой код для пользовательского просмотра здесь

class SubscriptionView: UIView {

    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var subTitle: UILabel!
    @IBOutlet weak var checkMark: UIImageView!
    var isSelect: Bool = false

    let nibName = "SubscriptionView"
    var contentView: UIView?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapAction)))
    }

    func commonInit() {
        guard let view = loadViewFromNib() else {
            return
        }
        view.frame = self.bounds
        view.layer.masksToBounds = true
        view.layer.cornerRadius = 14
        view.layerBorderColor = AppColor.amaranth
        view.layerBorderWidth = 0.5
        self.addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }

    public func selectedView(_ isSelect: Bool) {
        self.isSelect = isSelect
        title.textColor = isSelect ? UIColor.white : AppColor.amaranth
        subTitle.textColor = isSelect ? UIColor.white : AppColor.amaranth
        checkMark.alpha = isSelect ? 1.0 : 0.0
        contentView!.backgroundColor = isSelect ? AppColor.amaranth : UIColor.white
    }

    @objc private func tapAction() {
        ///????? selectedView

    }
}

1 Ответ

0 голосов
/ 20 июня 2019

Вот очень простой пример использования шаблона делегата / протокола.

Определение протокола:

// Protocol / Delegate pattern
protocol SubscriptionViewDelegate {
    func gotTap(from sender: SubscriptionView)
}

Ваш контроллер вида должен соответствовать этому протоколу. В вашем пользовательском SubscriptionView классе, когда пользователь нажимает, вы сообщаете делегату , что касание получено, и контроллер будет перебирать объекты SubscriptionView, устанавливая состояние "selected" в true или false. на основе постукивающего вида.

class SubscriptionsViewController: UIViewController, SubscriptionViewDelegate {

    let theStackView: UIStackView = {
        let v = UIStackView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.axis = .vertical
        v.alignment = .fill
        v.distribution = .fill
        v.spacing = 20
        return v
    }()

    // array to track the "subscription" views
    var arrayOfSubscriptionViews: [SubscriptionView] = [SubscriptionView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .yellow

        // add a stack view to hold the "subscription" views
        view.addSubview(theStackView)

        NSLayoutConstraint.activate([
            theStackView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20.0),
            theStackView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20.0),
            theStackView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20.0),
            ])

        // instantiate 3 "subscription" views
        for _ in 1...3 {

            // instantiate view
            let v = SubscriptionView()

            // set self as its delegate
            v.delegate = self

            // add it to our stack view
            theStackView.addArrangedSubview(v)

            // append it to our tracking array
            arrayOfSubscriptionViews.append(v)

        }

    }

    func gotTap(from sender: SubscriptionView) {

        // just for dev / debugging
        print("got tap from", sender)

        // loop through the subscription views,
        // setting the sender selected to TRUE
        // the others to FALSE

        arrayOfSubscriptionViews.forEach {
            $0.selectedView($0 == sender)
        }

    }

}

// Protocol / Delegate pattern
protocol SubscriptionViewDelegate {
    func gotTap(from sender: SubscriptionView)
}

class SubscriptionView: UIView {

    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var subTitle: UILabel!
    @IBOutlet weak var checkMark: UIImageView!
    var isSelect: Bool = false

    var delegate: SubscriptionViewDelegate?

    let nibName = "SubscriptionView"
    var contentView: UIView?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    func commonInit() {
        guard let view = loadViewFromNib() else {
            return
        }
        view.frame = self.bounds
        view.layer.masksToBounds = true
        view.layer.cornerRadius = 14
        view.layer.borderColor = UIColor.red.cgColor // AppColor.amaranth
        view.layer.borderWidth = 0.5
        self.addSubview(view)
        contentView = view

        selectedView(false)

        addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapAction)))
    }

    func loadViewFromNib() -> UIView? {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }

    public func selectedView(_ isSelect: Bool) {
        self.isSelect = isSelect
        title.textColor = isSelect ? UIColor.white : .red // AppColor.amaranth
        subTitle.textColor = isSelect ? UIColor.white : .red // AppColor.amaranth
        checkMark.alpha = isSelect ? 1.0 : 0.0
//      contentView!.backgroundColor = isSelect ? AppColor.amaranth : UIColor.white
        contentView!.backgroundColor = isSelect ? UIColor.red : UIColor.white
    }

    @objc private func tapAction() {

        // for dev / debugging
        print("sending tap from", self)

        // tell the delegate self got tapped
        delegate?.gotTap(from: self)

    }
}

Я внес незначительные изменения в ваш SubscriptionView класс, поэтому вы сможете использовать его как есть с вашим существующим .xib

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