UIButton не работает загружен в дочерний ViewController

У меня есть MainViewController где я загружаю слайд-меню. MainViewController содержит статический TopView и ContentView где загружаются различные дочерние контроллеры или представления, в зависимости от того, какой пункт меню был выбран.

Внутри одного из детей загружена кнопка, но она не работает. Когда я запускаю приложение с ViewController, включающим кнопку с установленным значением "is initial View Controller", все работает правильно.

При запуске приложения с MainViewController как начальный View Controller с загруженным дочерним элементом, кнопка не работает (она загружается в виде, но не реагирует). Любые предложения, как я могу сделать эту работу?

Загрузка MainViewController дочернего представления

class MainViewController: UIViewController, SideBarDelegate {
var contentView = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ....
    contentView.backgroundColor = UIColor(red: 70/255, green: 174/255, blue: 253/255, alpha: 1)
    contentView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(contentView)
    contentView.topAnchor.constraint(equalTo: statusBarView.bottomAnchor).isActive = true
    contentView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
    contentView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
    contentView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    contentView.layoutIfNeeded()

}

func sideBarDidSelectButtonAtIndex(_ index: Int) {
    ...       
    if index == 0{
        statusBarLabel.text = "First"
        let controller:FirstViewController = storyboard!.instantiateViewController(withIdentifier: "First") as! FirstViewController
        controller.view.frame = ContentView.bounds
        controller.willMove(toParentViewController: self)
        contentView.addSubview(controller.view)
        controller.didMove(toParentViewController: self)
        print("touched index 0")
    } else if index == 1{
        // index is 1
    }
}

FirstViewController

class FirstViewController: UIViewController, UIScrollViewDelegate {

    let addButton = UIButton()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1)

        addButton.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 60)
        addButton.clipsToBounds = true
        addButton.setTitleColor(UIColor.white, for: .normal)
        addButton.backgroundColor = UIColor(red: 102/255, green: 204/255, blue: 255/255, alpha: 1)
        addButton.setTitle("add feed", for: .normal)
        addButton.titleLabel?.font = UIFont.systemFont(ofSize: 20, weight: UIFontWeightRegular)
        self.view.addSubview(AddButton)
        addButton.layoutIfNeeded()
        addButton.addTarget(self, action: #selector(touchUpAddButton), for: UIControlEvents.touchUpInside)
        addButton.addTarget(self, action: #selector(touchDownAddButton), for: UIControlEvents.touchDown)

    func touchUpAddButton() {
        addButton.backgroundColor = UIColor(red: 102/255, green: 204/255, blue: 255/255, alpha: 1)
    }

    func touchDownAddButton() {
        addButton.backgroundColor = UIColor(red: 70/255, green: 174/255, blue: 253/255, alpha: 1)
    }
}

2 ответа

Обновите ваши функции до этих

func TouchUpAddButton(sender: UIButton){
    addButton.backgroundColor = UIColor(red: 102/255, green: 204/255, blue: 255/255, alpha: 1)

}

func TouchDownAddButton(sender: UIButton) {
    addButton.backgroundColor = UIColor(red: 70/255, green: 174/255, blue: 253/255, alpha: 1)
}

И измените свой код добавления цели в

addButton.addTarget(self, action: #selector(FirstViewController.touchUpAddButton(_:)), for: .touchDown)
addButton.addTarget(self, action: #selector(FirstViewController.touchDownAddButton(_:)), for: .touchDown)

Первое решение:

Удаление ограничений автоматического макета

Второе решение:

Кнопка не выполняет действие, потому что представление контроллера дочернего представления должно быть добавлено непосредственно в представление контроллера контейнера (в вашем случае: представление MainViewController), а не через промежуточное представление (в вашем случае: contentView)

При добавлении представления в контейнер вам не нужно использовать функцию addSubview, так как функциональность FirstViewController не работает.

Используйте код ниже:

let newViewController:FirstViewController = storyboard!.instantiateViewController(withIdentifier: "First") as! FirstViewController
let oldViewController  = childViewControllers.last! as UIViewController
    oldViewController.willMove(toParentViewController: nil)
    addChildViewController(newViewController)
    transition(from: oldViewController, to: newViewController, duration: 0.25, options: .transitionCrossDissolve, animations:{ () -> Void in
        // nothing needed here
    }, completion: { (finished) -> Void in
        oldViewController.removeFromParentViewController()
        newViewController.didMove(toParentViewController: self)
    })

Вы можете изменить продолжительность, она используется для анимации

Другие вопросы по тегам