如何在UIView中加载xib文件

时间:2011-10-18 23:24:27

标签: ios objective-c uiview xib

我到处都在搜索,到目前为止没有任何东西对我有效。

基本上我想要一个名为rootView.xib的.xib文件,在其中我希望有一个UIView(让我们称之为containerView)只占用屏幕的一半(所以会有常规视图和一个新的视图)。然后我想要一个名为firstView.xib的不同.xib文件并将其加载到containerView中。所以我可以在firstView.xib上有一堆东西和rootView.xib中的一堆不同的东西,并在rootView.xib中加载我的firstView.xib在containerView内,但由于它只占用了屏幕的一半,你仍然可以看到rootView.xib上的东西

7 个答案:

答案 0 :(得分:177)

要以编程方式从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];

答案 1 :(得分:24)

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

这对于您希望在不同的UIViewController对象上重用的小部件非常有用。

  1. 新方法:https://github.com/PaulSolt/CustomUIView
  2. 原创方法:https://github.com/PaulSolt/CompositeXib
  3. Load a Custom UIView from .xib file

答案 2 :(得分:18)

你可以尝试:

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

答案 3 :(得分:15)

[Swift Implementation]

Universal way of loading view from xib:

Example:

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

Implementation:

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))
    }
}

答案 4 :(得分:5)

创建XIB文件:

  

档案 - &gt;新文件 - &gt; ios-&gt;可可触摸类 - &gt;下一个

enter image description here

确保勾选“也创建XIB文件”

我想使用tableview执行,因此我选择了子类UITableViewCell

您可以选择作为您的申请

enter image description here

根据您的意愿设计XIB文件(RestaurantTableViewCell.xib)

enter image description here

我们需要抓住行高来设置表格每行hegiht

enter image description here

现在!需要抓住他们快速文件。我很讨厌restaurantPhotorestaurantName你可以帮到你们所有人。

enter image description here

现在添加UITableView

enter image description here

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

<强>所有者
要指定为nib的File的Owner对象的对象。

选项
包含打开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
    }

}

你做完了:)

enter image description here

答案 5 :(得分:3)

对于swift 3&amp; 4

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

答案 6 :(得分:0)

对于 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)