UISegmented Control подпредставления не появляются - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь использовать UISegmentedControl для переключения между тремя представлениями.У меня есть первый вид в представлении контейнера на главном viewcontroller.Затем я создал два других представления для отдельных контроллеров представления.Я запрограммировал подпредставления для этих двух представлений в контейнере основного viewcontroller.

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

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

Вот код:

@IBOutlet var segment: UISegmentedControl!

@IBOutlet var detailsView: UIView!

@IBOutlet var segmentView: UIView!
var viewTwo: UIView!
var viewThree: UIView!

@IBAction func segmentChange(_ sender: Any) {

    switch(segment.selectedSegmentIndex) {

    case 0:

        detailsView.isHidden = false
        segmentView.isHidden = true

        break

    case 1:

        detailsView.isHidden = true
        segmentView.isHidden = false
        segmentView.bringSubviewToFront(viewTwo)

        break

    case 2:

        detailsView.isHidden = true
        segmentView.isHidden = false
        segmentView.bringSubviewToFront(viewThree)

        break

    default:
        detailsView.isHidden = false
        segmentView.isHidden = true
        break

    }

}


override func viewDidLoad() {
    super.viewDidLoad()

    viewTwo = ShowtimesView().view
    segmentView.addSubview(viewTwo)
    viewThree = ReviewsView().view
    segmentView.addSubview(viewThree)


}

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

вам нужно кодировать контроллер представления init из раскадровки, например:

override func viewDidLoad() {
    super.viewDidLoad()

    viewTwo = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ShowtimesView") as! ShowtimesView).view
    segmentView.addSubview(viewTwo)
    viewThree = (UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ReviewsView") as! ReviewsView).view
    segmentView.addSubview(viewThree)
}

1 "Main" - это ваше имя StoryBoard
2 "ShowtimesView" - это идентификатор раскадровки, например:

enter image description here

0 голосов
/ 25 октября 2018

Проблема в том, что вы говорите что-то вроде ShowtimesView().view.Это не то, как загрузить контроллер представления из раскадровки!Вам нужно поговорить с раскадровкой и создать экземпляр контроллера представления.

Однако даже тогда то, что вы делаете, совершенно неправильно.Вы не можете использовать контроллер представления, чтобы «бросить мусорное ведро» для его представления и вещей, которые беспочвенно просматривают в вашем интерфейсе.Вы должны превратиться в собственный родительский контроллер представления, а другой контроллер представления - в своего ребенкаЕсть формальный танец, который вы должны сделать, и вы не делаете его.

0 голосов
/ 25 октября 2018

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

Вот рабочий код:

@IBOutlet var segment: UISegmentedControl!

@IBOutlet var detailsView: UIView!


@IBOutlet var showtimeView: UIView!
@IBOutlet var reviewView: UIView!
var viewTwo: UIView!
var viewThree: UIView!

@IBAction func segmentChange(_ sender: Any) {

    switch(segment.selectedSegmentIndex) {

    case 0:

        detailsView.isHidden = false
        showtimeView.isHidden = true
        reviewView.isHidden = true            

        break

    case 1:

        detailsView.isHidden = true
        showtimeView.isHidden = false
        reviewView.isHidden = true

        break

    case 2:

        detailsView.isHidden = true
        showtimeView.isHidden = true
        reviewView.isHidden = false

        break

    default:
        detailsView.isHidden = false
        showtimeView.isHidden = true
        reviewView.isHidden = true
        break

    }

}


override func viewDidLoad() {
    super.viewDidLoad()

    viewTwo = ShowtimesView().view
    showtimeView.addSubview(viewTwo)
    viewThree = ReviewsView().view
    reviewView.addSubview(viewThree)


}
0 голосов
/ 24 октября 2018

Вы должны попробовать код ниже.

@IBOutlet var segment: UISegmentedControl!

@IBOutlet var segmentView: UIView!

var viewOne: UIView!
var viewTwo: UIView!
var viewThree: UIView!

@IBAction func segmentChange(_ sender: Any) {

    switch(segment.selectedSegmentIndex) {

    case 0:
        segmentView.bringSubviewToFront(viewOne)
        break

    case 1:
        segmentView.bringSubviewToFront(viewTwo)
        break

    case 2:
        segmentView.bringSubviewToFront(viewThree)
        break

    default:
        segmentView.bringSubviewToFront(viewOne)
        break
    }
}


override func viewDidLoad() {
    super.viewDidLoad()

    viewOne = DetailView().view
    segmentView.addSubview(viewOne)
    viewTwo = ShowtimesView().view
    segmentView.addSubview(viewTwo)
    viewThree = ReviewsView().view
    segmentView.addSubview(viewThree)

    segmentView.bringSubviewToFront(viewOne)
}
...