如何在Swift 3中将XIB视图添加到视图控制器

3
我正在尝试将这个XIB视图添加到我的视图控制器中:
import UIKit

class TranslateView: UIView {
    @IBOutlet var TranslateView: UIView!

    override init(frame: CGRect){
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    private func commonInit(){
        Bundle.main.loadNibNamed("TranslateView", owner: self, options: nil)
        addSubview(TranslateView)
        TranslateView.frame = self.bounds
        TranslateView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }
}

我正在这里将其加载到我的视图控制器中:

import UIKit
import AVFoundation
import Vision

class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
    let captureSession = AVCaptureSession()

    let button: UIButton = {
        let button = UIButton()

        button.addTarget(self, action: #selector(ViewController.pressed(sender:)),for: .touchUpInside)
        button.backgroundColor = UIColor.clear
        button.setTitle("Translate", for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        setupCaptureSession()
        view.addSubview(button)
    }

    @objc func pressed(sender: UIButton!) {
        //add label
        button.removeFromSuperview()

        let headerView = Bundle.main.loadNibNamed("TranslateView", owner:
            self, options: nil)?.first as? TranslateView
        self.view.addSubview(headerView!)
        headerView?.frame = CGRect(x:0, y: 0, width: view.frame.width, height: 50.0)
    }

我已经删除了大部分代码以使这个问题简短。我不使用故事板,因为我想将实时相机视图作为应用程序的背景。通过这种方式做是最简单的。我希望发生的是,当我按下按钮时,整个屏幕应该被一个名为TranslateView.xib的新视图替换。
希望有人能帮忙。或者,如果有更好的更简单的方法来实现相同的结果,请让我知道。
请提供一个Swift 3的代码示例,而不仅仅是解释要做什么,因为我已经知道我需要做什么,只是不知道如何编码。

为什么在 TranslateView 的一个实例中持有另一个 TranslateView 的实例,看起来很奇怪:为什么在 TranslateView 中有一个 IBOutlet 到另一个 TranslateView? - LukeSideWalker
2个回答

1
尝试更改此代码。
let headerView = Bundle.main.loadNibNamed("TranslateView", owner:
    self, options: nil)?.first as? TranslateView

转换为中文:

let headerView = TranslateView()

0

我认为如果你将你的TranslationView转换成一个UIViewController会更好。这不会是一个很大的改变,但是将TranslationView添加到你的ViewController中会更加简单。例如:

class TranslateView: UIViewController {
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: "TranslationView", bundle: nil)
    }
}

然后,您可以像下面这样将此控制器加载到您的ViewController类中:

let headerView = TranslationView()
self.addChildViewController(headerView)
self.view.addSubview(headerView.view)
headerView.didMoveToParentViewController(self)
headerView.view.frame = CGRect(x:0, y: 0, width: view.frame.width, height: 50.0)

嘿,谢谢,这个很有效!你能否再添加一些代码,将子视图控制器从视图控制器中删除?问候Sieuwe。 - Sieuwe Elferink
1
以下是你需要做的来移除 :) headerView.willMoveToParentViewController(nil) headerView.view.removeFromSuperViewController() headerView.removeFromParentViewController() - Umair Aamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接