【问题标题】:Xib not showing up in viewXib 未显示在视图中
【发布时间】:2018-06-06 23:49:42
【问题描述】:

我有一个 Xib 文件,试图用我的故事板设置它。 Xib 文件中的所有内容都很好,但由于某种原因,它没有显示。我从 GitHub 导入了一个文件,该文件设置为我的 Xib,它在 Objective-C 中,我设置了桥接,没有错误。但是当我运行它时,什么都没有显示它的空白。我没有在视图控制器中设置一些东西吗?一切都以编程方式完成,我只是在情节提要中设置类。

故事板屏幕截图:

当我推送到 ViewController 时模拟器给了我什么:

这是我应该看到的:

我想要实现的 - https://github.com/jberlana/JBCroppableView

我的 XIB 课

import UIKit

class CropViewXIB: UIView {

    @IBOutlet weak var ImageView: JBCroppableImageView!

    @IBAction func SubAction(_ sender: Any) {
        ImageView.removePoint()
    }

    @IBAction func AddAction(_ sender: Any) {
        ImageView.addPoint()
    }

    @IBAction func UndoAction(_ sender: Any) {
        ImageView.reverseCrop()
    }

    @IBAction func CropAction(_ sender: Any) {
        ImageView.crop()
    }


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

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

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

    }
}

我的视图控制器

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var cropView: CropViewXIB!

    override func viewDidLoad() {
        super.viewDidLoad()  
    }
}

【问题讨论】:

标签: objective-c swift xib


【解决方案1】:

问题是您实际上并没有获得 UINib 对象的父视图。

Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)

上面的行返回[Any] 在您的情况下,您甚至没有使用它返回的视图。所以想法是从中获取第一个对象并将其转换为UIView,例如:

 Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)?.first as? UIView

就我个人而言,这就是我与 Nib 交互的方式。我创建了一个 UIView 类型的 view 属性,它可以被称为 nib 的父视图,并且所有子视图都被添加到它而不是 self

类似这样的:

final class SomeNibView: UIView {
    public var view: UIView!


    private func setup() { // called to the initializer 
        // grab the views from loadNibNamed
        guard let _view = Bundle.main.loadNibNamed("name", owner: self, options: nil)?.first as? UIView else { return }
        // set it to our view property 
        view = _view
        // add this property to the nib subview aka self 
        addSubview(view)

        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }

    private func addMulitpleSubviews() {
        // instead of doing self.addSubview(....) when it comes to add other subviews 
       // you'll do this view.addSubview(....)
   }
}

【讨论】:

  • 好的,但现在它在警卫声明中给了我一个错误。
  • 这并不是说没有,在我的代码中我输入了name 它应该是你的xib的名称
  • 是的,我确实设置了它
  • 你为什么不创建一个虚拟项目并尝试这段代码,并一点一点地配置它,直到你得到你得到的错误
【解决方案2】:

尝试使用编程而不是使用情节提要加载 xib。

override func viewDidLoad()
 {
    super.viewDidLoad()
    guard let yourXIB = Bundle.main.loadNibNamed("CropViewXIB", owner: self, options: nil)?.first as? CropViewXIB else { return}
self.view.addSubview(yourXIB)
}

【讨论】:

  • loadNibNamed 返回一个[Any] 的数组,所以你所拥有的将不起作用
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多