Как мне запустить событие с кнопки внутри дочернего представления, чтобы вызвать событие в родительском представлении? Кнопка не работает

#ios #swift #xcode #macos #mobile

#iOS #swift #xcode #macos #Мобильный

Вопрос:

Я пытаюсь создать процесс проверки в 4 шага, чтобы сделать мой код более эффективным, я решил использовать дочерние представления и просто соответствующим образом обновить пользовательский интерфейс. Мне удалось добавить мой дочерний вид в мой MasterView, однако я не могу нажать кнопку внутри моего дочернего представления.

Я уже проверил иерархию представлений, и над моей кнопкой ничего нет. Я также попытался добавить действие программно, повторно добавил кнопку, но я не могу заставить ее работать. Я новичок в разработке Swift, поэтому, вероятно, я что-то упускаю.

Код дочернего представления

 protocol IdentityVerificationIntroChildViewControllerDelegate{
    func startVIProcess(_ sender: Any)
}

class IdentityVerificationIntroChildViewController: UIView{
    
    @IBOutlet var contentView: UIView!
    var delegate: IdentityVerificationIntroChildViewControllerDelegate?
    @IBOutlet weak var mStartVIBtn: UIButton!
    
    override init(frame: CGRect){
        super.init(frame: frame)
        commonInit()
    }
    
    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
        commonInit()
    }
    
    
    private func commonInit(){
        Bundle.main.loadNibNamed("IdentityVerificationIntroChildView", owner: self, options: nil)
        mStartVIBtn.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]


    }
    
    @objc func buttonAction(sender: UIButton!) {
        print("works")
    }
    
}
 

Код основного представления

 final class MasterIdentityVerificationViewController: UIViewController {

    @IBOutlet weak var mContainerView: UIView!
    @IBOutlet weak var mStepIndicator: StepIndicatorView!
    
    private var currentView: UIView?


    override func viewDidLoad() {
        super.viewDidLoad()
        setChildView(subView: IdentityVerificationIntroChildViewController())
    }
    
    private func setChildView(subView: UIView){
        currentView?.removeFromSuperview()
        currentView = subView
        currentView?.translatesAutoresizingMaskIntoConstraints = false
        guard let currentView = currentView else { return }
        mContainerView.addSubview(currentView)
        NSLayoutConstraint.activate([
            currentView.topAnchor.constraint(equalTo: mContainerView.topAnchor),
            currentView.trailingAnchor.constraint(equalTo: mContainerView.trailingAnchor),
            currentView.leadingAnchor.constraint(equalTo: mContainerView.leadingAnchor),
            currentView.bottomAnchor.constraint(equalTo: mContainerView.bottomAnchor)
        ])
    }
}


extension MasterIdentityVerificationViewController: IdentityVerificationIntroChildViewControllerDelegate{
    func startVIProcess(_ sender: Any) {
        performSegue(withIdentifier: "fromVIIntroToVIIDCapture", sender: sender)
        print("adfsdfs")
    }
    

}
 

Иерархия просмотра, проблемная кнопка выделена

Зеленая область — это место, где переключаются дочерние представления

Я был бы очень признателен за любую помощь. Спасибо

Комментарии:

1. Немного вводит в заблуждение наличие «viewcontroller» в имени представления. В любом случае, вам необходимо настроить userInteractionEnabled=true дочерние представления

2. @Paulw11 Спасибо за ваш ответ, я безуспешно пробовал эти строки внутри моего дочернего представления mStartVIBtn.isUserInteractionEnabled = true contentView.isUserInteractionEnabled = true

3. Вам нужно self.isUserInteractionEnabled=true , поскольку self ваш родительский вид и простые UIView s по умолчанию не взаимодействуют с пользователем.