【问题标题】:How to load a xib file in a UIView如何在 UIView 中加载 xib 文件
【发布时间】:2011-12-10 12:35:41
【问题描述】:

我一直在到处寻找,但到目前为止没有什么对我有用。

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

【问题讨论】:

  • 注意,这个任务是过时的。多年来,只需使用容器视图tutorial

标签: ios objective-c uiview xib


【解决方案1】:

要以编程方式从 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 的半屏)应该是滑动的。如果可能,请提供帮助。
  • 它不适用于thisView.alpha = 0thisView.superview(显示为零)
【解决方案2】:

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

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

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

【讨论】:

  • 很棒的库,效果很好!你自己还在用吗? :)
  • 当咖啡配方开始时,我将这种加载技术与 Storyboard 和 XIB 文件一起用于我的 BrewCoffeeApp.com 中的自定义视图。
【解决方案3】:

你可以试试:

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

【讨论】:

  • 这不是您所建议的。他说他的“rootView.xib”将有一个名为“containerView”的屏幕大小一半的子视图。在 containerView 中,他想加载他的 nib“firstView.xib”的内容。
【解决方案4】:

【快速实现】

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

【讨论】:

  • 按照最新的 Swift:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
【解决方案5】:

创建 XIB 文件:

文件->新建文件->ios->可可触摸类->下一个

确保勾选“同时创建 XIB 文件”

我想和tableview一起表演所以我选择了子类UITableViewCell

您可以选择作为您的要求

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

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

现在!需要把他们快速归档。我被restaurantPhotorestaurantName 搞砸了,你们可以搞砸你们所有人。

现在添加一个 UITableView

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

所有者
分配为 nib 的 File's 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
    }

}

你完成了:)

【讨论】:

  • 你能告诉我吗?为什么投反对票,那我会很高兴
  • 您的示例可以从 xib 加载中查看。但是对于 tableView 是错误的 - 可重复使用的单元格是正确的方法
【解决方案6】:

对于 swift 3 和 4

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

【讨论】:

    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-10
      • 2017-12-09
      • 2016-10-31
      • 2015-04-08
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多