如何在UIKit中使用子视图控制器?

问题描述 投票:0回答:1

我想将

ViewController
添加到另一个
ViewController
中。我使用这个代码:

class CustomPageViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let childViewController = UIStoryboard(name: "Storyboard", bundle: nil).instantiateViewController(withIdentifier: "ContentViewController")
        self.addChildViewController(childViewController)
        self.view.addSubview(childViewController.view)
        childViewController.didMove(toParentViewController: self)
        childViewController.view.frame = self.view.frame
    }
}

class ContentViewController: UIViewController {

      override func viewDidLoad() {
         super.viewDidLoad()
    
         view.backgroundColor = .white
    }
}

但结果我只有灰屏。在我的

ContentViewController 
中,我使用红色作为背景视图颜色,并且我有标签

更新:

灰色背景是图像的背景。问题是我的内容没有加载到控制器中。

母VC

private struct PagesData: Decodable {
    var pagesData: [PageData]
}

private struct PageData: Decodable {
    let textData, textPosition: String
}

class CustomPageViewController: UIViewController {

    private var pagesContent: [ContentViewController] = []
    private var pagesData = [PageData]()
    let contentViewController = ContentViewController()
    
    var pageNumber = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let childViewController = UIStoryboard(name: "Storyboard", bundle: nil).instantiateViewController(withIdentifier: "ContentViewController")
        self.addChildViewController(childViewController)
        self.view.addSubview(childViewController.view)
        childViewController.didMove(toParentViewController: self)
        childViewController.view.frame = self.view.frame
        
        loadData()
    }
            
    func loadData() {
        
        let url = Bundle.main.url(forResource: "pages", withExtension: "json")!
        let data = try! Data(contentsOf: url)
        let result = try! JSONDecoder().decode(PagesData.self, from: data)
        
        for page in result.pagesData {
            let contentVC = ContentViewController()
            contentVC.configure(text: page.textData,
                                image: "image\(pagesContent.count).png",
                                position: page.textPosition)
            pagesContent.append(contentVC)
        }
    }

}

儿童VC

import UIKit

class ContentViewController: UIViewController {
    
    var textPosition = "bottomLeft"
    
    private lazy var textLabel: UILabel = {
        
        let label = UILabel()
        label.textAlignment = .left
        label.numberOfLines = 0
        label.textColor = .white
        label.sizeToFit()
        label.font = UIFont.systemFont(ofSize: 25, weight: .bold)
        label.translatesAutoresizingMaskIntoConstraints = false
        
        return label
        
    }()
    
    private lazy var imageView: UIImageView = {
        
        let image = UIImageView()
        image.contentMode = .scaleToFill
        image.translatesAutoresizingMaskIntoConstraints = false
        image.backgroundColor = .gray
        
        return image
        
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupViews()
        setupConstraints()
    }
    
    private func setupViews() {
        view.addSubview(imageView)
        view.addSubview(textLabel)
    }
        
    private func setupConstraints() {
        
        imageView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
        imageView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true
        imageView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0).isActive = true
        imageView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0).isActive = true
        
        switch textPosition {
        case "topCenter":
            
            textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
                                           constant: 16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16).isActive = true
            
        case "centerCenter":
            
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16).isActive = true
            textLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            textLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
            
        case "bottomCenter":
            
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16).isActive = true
            
        case "topLeft":
            
            textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
                                           constant: 16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16 - (view.frame.size.width/2)).isActive = true
            
        case "centerLeft":
            
            textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
                                           constant: 16).isActive = true
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16 - (view.frame.size.width/2)).isActive = true
            
        case "bottomLeft":
            
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, 
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, 
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16 - (view.frame.size.width/2)).isActive = true
            
        case "topRight":
            
            imageView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
                                           constant: 0).isActive = true
            imageView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, 
                                               constant: 0).isActive = true
            imageView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, 
                                                constant: 0).isActive = true
            
        case "centerRight":
            
            textLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor,
                                           constant: 16).isActive = true
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor, 
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor, 
                                               constant: 16 + (view.frame.size.width/2)).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16).isActive = true
            
        case "bottomRight":
            
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16 + (view.frame.size.width/2)).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, 
                                                constant: -16).isActive = true
            
        default:
            
            textLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor,
                                              constant: -16).isActive = true
            textLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor,
                                               constant: 16).isActive = true
            textLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor,
                                                constant: -16).isActive = true
        }
    }

    func configure(text: String, image: String, position: String) {
        textLabel.text = text
        imageView.image = UIImage(named: image)
        textPosition = position
        
        print(text)
    }

}
swift uikit
1个回答
0
投票

您错过了

frame
childViewController.view
及其父视图:

childViewController.view.frame = self.view.frame
© www.soinside.com 2019 - 2024. All rights reserved.