如何在UIView中加载Xib文件


111

我一直在到处搜索,但到目前为止没有任何工作对我有用。

基本上,我希望有一个名为rootView.xib的.xib文件,在其中我希望有一个UIView(可以称其为containerView),它仅占据屏幕的一半(因此会有常规视图和新视图)。然后我想要一个名为firstView.xib的不同.xib文件,并将其加载到containerView内部。因此,我可以在firstView.xib上放一堆东西,在rootView.xib中放一堆不同的东西,然后将firstView.xib加载到rootView.xib的containerView内,但是由于它只占据屏幕的一半,因此您仍然会看到rootView.xib上的内容


2
请注意,此问题是过时的。多年以来,只需使用容器视图教程
Fattie

Answers:


181

要以编程方式从xib文件中获取对象,可以使用:[[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]返回xib中顶级对象的数组。

因此,您可以执行以下操作:

UIView *rootView = [[[NSBundle mainBundle] loadNibNamed:@"MyRootView" owner:self options:nil] objectAtIndex:0];
UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"MyContainerView" owner:self options:nil] lastObject];
[rootView addSubview:containerView];
[self.view addSubview:rootView];

@PaulSolt先生,我有一个与此任务有关的查询。我想打开Xib的子视图作为幻灯片菜单。当我从视图控制器中单击菜单按钮时,只有子视图(这是xib的半屏)应该滑动。请帮助。
sandeep tomar

它不适用于 thisView.alpha = 0thisView.superview(显示为零)
杰克

24

我在github上创建了一个示例项目,以从另一个.xib文件中的.xib文件加载UIView。或者,您可以通过编程方式进行。

这对于要在不同的UIViewController对象上重用的小部件很有用。

  1. 新方法:https//github.com/PaulSolt/CustomUIView
  2. 原始方法:https//github.com/PaulSolt/CompositeXib

从.xib文件加载自定义UIView


伟大的库,伟大的作品!您还在自己使用它吗?:)
AnthoPak

当咖啡配方开始时,我将这种加载技术与情节提要和XIB文件一起用于BrewCoffeeApp.com中的自定义视图。
保罗·索尔特

21

您可以尝试:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];

这不完全是您的建议。他说他的“ rootView.xib”将有一个名为“ containerView”的子视图,其大小是屏幕的一半。并将其笔尖“ firstView.xib”的内容加载到containerView中。
NJones 2011年

19

[快速实施]

从xib加载视图的通用方法:

例:

let myView = Bundle.loadView(fromNib: "MyView", withType: MyView.self)

实现方式:

extension Bundle {

    static func loadView<T>(fromNib name: String, withType type: T.Type) -> T {
        if let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T {
            return view
        }

        fatalError("Could not load view with type " + String(describing: type))
    }
}

1
根据最新的Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen '19

6

创建一个XIB文件:

文件->新文件-> iOS->可可触摸类->下一步

在此处输入图片说明

确保选中标记“还创建XIB文件”

我想表演,tableview所以我选择了子类UITableViewCell

您可以选择作为您的需求

在此处输入图片说明

如您所愿的XIB文件(RestaurantTableViewCell.xib)

在此处输入图片说明

我们需要抓住行高来设置表格每一行的高度

在此处输入图片说明

现在!需要把他们快速地藏起来。我被欺骗了restaurantPhotorestaurantName你可以欺骗所有人。

在此处输入图片说明

现在添加一个UITableView

在此处输入图片说明

name
nib文件的名称,不需要包含.nib扩展名。

owner
分配为笔尖文件的Owner对象的对象。

options
字典,其中包含打开nib文件时要使用的选项。

第一 ,如果你不首先定义掠然后所有视图..所以,你需要抓住这组内的一个观点frist

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

这是表视图控制器的完整代码

import UIKit

class RestaurantTableViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let restaurantTableviewCell = Bundle.main.loadNibNamed("RestaurantTableViewCell", owner: self, options: nil)?.first as! RestaurantTableViewCell

        restaurantTableviewCell.restaurantPhoto.image = UIImage(named: "image1")
        restaurantTableviewCell.restaurantName.text = "KFC Chicken"

        return restaurantTableviewCell
    }
   // set row height
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 150
    }

}

你完成了:)

在此处输入图片说明


1
你能告诉我吗?为什么被否决,然后我会很高兴
Nazmul Hasan

6
您的示例可以从xib加载中查看。但是对于tableView,这是错误的-可重用单元格是正确的方式
Viktor

4

快速3和4

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView

2

对于Swift 4.2

假设您有一个名为NibView的类,并且相关的nib文件是NibView.xib

class NibView: UIView {

    class func getScreen() -> NibView {
        let xib = Bundle.main.loadNibNamed(String(describing :self), owner: self, options: nil)
        let me = xib![0] as! NibView
        return me
    }

}

创建该类的实例,并根据需要使用特定的布局添加到视图中

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.