使用SegmentController使TableView消失并显示UIContainerView

时间:2017-10-26 18:18:51

标签: ios swift xcode uisegmentedcontrol

我正在尝试使用段控制器在我的tableView和容器视图之间切换,但是当我尝试在它们之间切换时,它只有一半可以工作。 TableView出现并消失,但容器视图永远不会出现。

这是我的代码:

@IBAction func switchAction(_ sender: UISegmentedControl) {
    if sender.selectedSegmentIndex == 0 {
        profileTableView.isHidden = false
        modelsContainerView.isHidden = true
    } else {
        profileTableView.isHidden = true
        modelsContainerView.isHidden = false
    }
}

更新

如果我使用此代码,模拟类型的工作。出现容器视图,但它不像tableview那样填满屏幕。

    @IBAction func switchAction(_ sender: UISegmentedControl) {
    if sender.selectedSegmentIndex == 0 {
        UIView.animate(withDuration: 0.5, animations: {
            self.profileTableView.alpha = 1
            self.modelsContainerView.alpha = 0
        })
    } else {
        UIView.animate(withDuration: 0.5, animations: {
            self.profileTableView.alpha = 0
            self.modelsContainerView.alpha = 1
        })
    }
}

Updated picture

我可以告诉它不起作用,因为我已将容器视图的背景颜色设置为粉红色。当我尝试从TableView(可以工作)切换到容器视图时,这就是它的样子: Segment With TableView

Segment Where Container View Should Appear (not working)

Storyboard

所有插座似乎都已连接。我的UI设置是段控制器后面的绿色视图,下面有一个tableView,并且在同一个地方有一个containerView。

非常感谢您的高级帮助。

1 个答案:

答案 0 :(得分:2)

尝试这种方法......

enter image description here

Seg背景视图高度为45点,顶部固定,前导,尾随全部等于0

配置文件容器固定为前导,尾随,底部均等于0,顶部固定在Seg背景的底部。

但你看不到Profile Container(红色背景),因为模型容器(橙色背景)位于它之上,并且......

模型容器的宽度和高度相等,并且水平和垂直居中,均为Profile Container。

Profile Container中嵌入了Profile Table VC。

模型容器中嵌入了模型VC。

这个想法是:

选择Seg 0时,个人资料容器为alpha 1且隐藏,而Models Container为alpha 0且 隐藏。

选择Seg 1时,个人资料容器为alpha 0且 隐藏,而Models Container为alpha 1且隐藏。

class SegContainerViewController: UIViewController {

    @IBOutlet weak var profileContainerView: UIView!
    @IBOutlet weak var modelsContainerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // start with Profile visible
        // so hide Models and set its alphs to 0
        self.modelsContainerView.alpha = 0
        self.modelsContainerView.isHidden = true

    }

    @IBAction func switchAction(_ sender: UISegmentedControl) {

        // on segment select, the "other" container will be
        // transparent and hidden, so
        // un-hide it, then animate the alpha for both (for cross-fade)
        // on animation completion, hide the now transparent container

        if sender.selectedSegmentIndex == 0 {

            self.profileContainerView.isHidden = false
            UIView.animate(withDuration: 0.5, animations: {

                self.profileContainerView.alpha = 1
                self.modelsContainerView.alpha = 0

            }, completion: { (finished: Bool) in

                self.modelsContainerView.isHidden = true

            })

        } else {

            self.modelsContainerView.isHidden = false
            UIView.animate(withDuration: 0.5, animations: {

                self.profileContainerView.alpha = 0
                self.modelsContainerView.alpha = 1

            }, completion: { (finished: Bool) in

                self.profileContainerView.isHidden = true

            })

        }

    }
}

修改

要访问嵌入式视图控制器,请覆盖prepareForSegue:

var theProfileVC: ProfileTableViewController?
var theModelsVC: ModelsViewControler?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let vc = segue.destination as? ProfileTableViewController {

        // do something here if desired, like setting a property of the VC

        // save a reference so we can use it later
        theProfileVC = vc
    }

    if let vc = segue.destination as? ModelsViewControler {

        // do something here if desired, like setting a property of the VC

        // save a reference so we can use it later
        theModelsVC = vc

    }

}

我还用一个例子更新了GitHub回购。

如果你想深入研究它,我把它作为一个示例项目:https://github.com/DonMag/SegmentsAndContainers