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

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

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

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

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)
    }
}

person Attila    schedule 12.04.2017    source источник


Ответы (3)


При добавлении представления в контейнер вам не нужно использовать функцию 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)
    })

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

person Neha    schedule 12.04.2017
comment
Мне нужно добавить его как subwiew, так как в моем MainViewController есть два представления: TopView и ContentView (туда я хочу добавить свои First- и SecondViewController). Или я не понимаю вашего решения? - person Attila; 12.04.2017
comment
Ваш ContentView - это своего рода UIContainerView? для замены представления в MainViewController используется UIContainerView, он будет отлично работать вместо UIView - person Neha; 12.04.2017

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

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)
person Devster101    schedule 12.04.2017
comment
и отправителем будет кнопка, которую можно изменить вместо addButton - person muescha; 12.04.2017
comment
Правильно, вы можете изменить AddButton на отправителя внутри функций touchUp и touchDown. - person Devster101; 12.04.2017
comment
он все еще не работает, теперь он выдает ошибку при компиляции: использование неразрешенного идентификатора TouchUpAddButton - person Attila; 12.04.2017
comment
Вы меняли код на тот, что у меня? С (отправитель: UIButton) в конце функции? Эта ошибка говорит о том, что не видит функцию TouchUpAddButton. - person Devster101; 12.04.2017
comment
да, я точно изменил код, как вы сказали, поэтому поместил (sender: UIButton) для обеих функций и изменил селектор на (_ :) - person Attila; 12.04.2017
comment
Хммм, а как выглядит автозаполнение? когда вы вводите методы добавления целевых объектов. AddButton.addTarget (self, action: #selector (T ‹--- Что Xcode показывает как автозаполнение, когда вы вводите здесь o? - person Devster101; 12.04.2017
comment
TouchUpAddButton (отправитель :) - person Attila; 12.04.2017
comment
извините, но он все еще не работает, я не знаю, что не так, я имею в виду, что сейчас он не выдает мне ошибки, но кнопка все еще не работает - person Attila; 12.04.2017

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

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

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

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

person Blazej SLEBODA    schedule 05.09.2019