【问题标题】:ViewController not displaying contents when embedded in UIViewViewController 嵌入 UIView 时不显示内容
【发布时间】:2015-12-13 23:32:08
【问题描述】:

我有一个包含两个容器(UIViews)的滚动视图。一个 UIView 包含一个正确显示的 UITableView 和另一个 ViewController。 viewController 有一个完全填充它的图像。但是,在添加视图控制器时,如果我设置了显示的背景颜色。

//
//  SideBarViewController.swift
//  Sidebar
//
//  Created by Satyajit Sarangi on 12/10/15.
//  Copyright © 2015 Satyajit Sarangi. All rights reserved.
//

import UIKit

class SideBarViewController: UIViewController {

    // MARK: Properties
    var scrollView: UIScrollView!

    let menuTableView = UITableView()
    let sideBarContainerView = UIView()
    let mainContainerView = UIView()
    let testContainerView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        // Create a dictionary for the views for the visual format language
        let containerViewsDict = Dictionary(dictionaryLiteral: ("sidebar_container", sideBarContainerView), ("main_container", mainContainerView))
        // let scrollViewDict = Dictionary(dictionaryLiteral: ("scrollview", scrollView))

        // Create two container


        // Add the scroll view
        scrollView = UIScrollView(frame: view.frame)

        // Set Properties for scrollview
        scrollView.scrollEnabled = true
        scrollView.pagingEnabled = true
        scrollView.contentSize = CGSizeMake(view.frame.width, view.frame.height)

        // sideBarContainerView.backgroundColor = UIColor.yellowColor()
        scrollView.addSubview(sideBarContainerView)
        scrollView.addSubview(mainContainerView)

        setupMainContainerView()
        setupSideBarTableView()


        // Add the Scroll View
        view.addSubview(scrollView)

        let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[sidebar_container]-5-[main_container]|", options: NSLayoutFormatOptions(rawValue:  0), metrics: nil, views: containerViewsDict)

        let scrollview_verticalConstraints1 = NSLayoutConstraint.constraintsWithVisualFormat("V:|[sidebar_container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: containerViewsDict)

        let scrollview_verticalConstraints2 = NSLayoutConstraint.constraintsWithVisualFormat("V:|[main_container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: containerViewsDict)

        sideBarContainerView.translatesAutoresizingMaskIntoConstraints = false
        mainContainerView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.translatesAutoresizingMaskIntoConstraints = false

        scrollView.addConstraints(horizontalConstraints)
        scrollView.addConstraints(scrollview_verticalConstraints1)
        scrollView.addConstraints(scrollview_verticalConstraints2)

        // Add constraints for the Scroll View
        // let scrollview_constraint_v = NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollview]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: scrollViewDict)

        // let scrollview_constraint_h = NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollview]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: scrollViewDict)

        // scrollView.addConstraints(scrollview_constraint_v)
        // scrollView.addConstraints(scrollview_constraint_h)
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        scrollView.frame = view.bounds
        view.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)

        scrollView.setContentOffset(CGPoint(x: 100, y: 0), animated: true)
    }


    // MARK: Set UI Properties
    func setupSideBarTableView() {
        menuTableView.frame = CGRectMake(0, 0, 200, scrollView.frame.height)
        menuTableView.contentSize = CGSizeMake(1000, 1000)
        menuTableView.backgroundColor = UIColor.redColor()
        sideBarContainerView.addSubview(menuTableView)

        let dict = Dictionary(dictionaryLiteral: ("menu_table", menuTableView))
        let constraint_h = NSLayoutConstraint.constraintsWithVisualFormat("H:|[menu_table]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict)
        let constraint_v = NSLayoutConstraint.constraintsWithVisualFormat("V:|[menu_table]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict)

        sideBarContainerView.frame = menuTableView.frame

        sideBarContainerView.addConstraints(constraint_h)
        sideBarContainerView.addConstraints(constraint_v)
    }

    func setupMainContainerView() {
//        testContainerView.frame = CGRectMake(0, 0, 320, scrollView.frame.height)
//        testContainerView.contentSize = CGSizeMake(1000, 1000)
//        testContainerView.backgroundColor = UIColor.yellowColor()

        let testContainerView = TestViewController()
        self.addChildViewController(testContainerView)

        mainContainerView.addSubview(testContainerView.view)

//        let dict = Dictionary(dictionaryLiteral: ("test_container", testContainerView))
//        let constraint_h = NSLayoutConstraint.constraintsWithVisualFormat("H:|[test_container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict)
//        let constraint_v = NSLayoutConstraint.constraintsWithVisualFormat("V:|[test_container]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: dict)

        mainContainerView.frame = testContainerView.view.frame
//        mainContainerView.addConstraints(constraint_h)
//        mainContainerView.addConstraints(constraint_v)
        testContainerView.didMoveToParentViewController(self)
    }
}

视图控制器看起来像这样......它的代码粘贴在下面。可以看出,故事板有图像,viewDidLoad 将其设置为黄色。但是,如果我关闭背景颜色,则看不到任何图像。

import UIKit

class TestViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.view.backgroundColor = UIColor.yellowColor()
    }
}

如何让 TestControllerView 显示其中的视图?

【问题讨论】:

  • 即使我们解开了蒙娜丽莎被盗之谜,这段代码也有一些奇怪的(我会认为是有问题的)事情。例如,这在滚动视图中有一个表格视图;这混合了手动frame 设置和自动布局;等等。如果您愿意,我很乐意建议如何简化这一点,但坦率地说,我在逆向工程所需的 UI 时遇到了麻烦。它只是左侧的表格视图和可以在右侧滚动的图像图像吗?还是只是在左侧选择图像名称并在右侧显示图像?想要的用户体验到底是什么?

标签: uiview uiviewcontroller uiscrollview swift2 ios9


【解决方案1】:

您正在像这样实例化TestViewController

let testContainerView = TestViewController()

这不会使用情节提要。如果您想使用情节提要,您可以在 Interface Builder 中为该场景指定一个“情节提要 ID”,然后您可以通过编程方式执行以下操作:

let testContainerView = storyboard?.instantiateViewControllerWithIdentifier("TestViewController storyboard id here")

顺便说一句,当您遇到这类问题时,从 Xcode 运行应用程序然后使用视图调试器会很有用:

这使您可以动态检查视图层次结构(因此您可以确认是否确实缺少某些内容,或者是否可能在屏幕外或不可见)。

【讨论】:

  • 非常感谢。让我试一试。但是有没有办法不使用情节提要?这会以某种方式起作用吗?
  • 我认为问题在于您在故事板场景中有蒙娜丽莎图像,而您想知道它在哪里。如果你想要故事板场景,你必须使用故事板。也许我误解了这个问题。但是,如果您愿意,可以确保您可以在没有情节提要的情况下以编程方式完成。但就像我在你的问题下的评论中所说的那样,我希望你能澄清你想要做什么......
  • 很抱歉给您带来了困惑。所以让我澄清一下这个问题。如果我使用 StoryBoard 创建 ViewController,是否有必要给它一个故事板 ID ?现在我想了想,类本身并不知道图像嵌入在 TestViewController 中,所以我看不到它。然而,故事板知道它,所以如果被故事板调用,那么它就会知道图像并渲染它。对吗?
  • 我为视图控制器分配了一个故事板 ID,但是,当我尝试像您建议的那样以编程方式调用它时,它总是返回 nil。知道为什么吗?我确保故事板 ID 在 IB 和代码中匹配。我唯一能想到的是 SideBarViewController 完全以编程方式完成,没有情节提要。
  • 我认为原因是因为视图控制器没有正确故事板的实例。这有效...谢谢 Rob.... let storyboard = UIStoryboard(name: "Main", bundle: nil) 让 testContainerView = storyboard.instantiateViewControllerWithIdentifier("testViewControllerID")
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多