我到处都在搜索,到目前为止没有任何东西对我有效。
基本上我想要一个名为rootView.xib的.xib文件,在其中我希望有一个UIView(让我们称之为containerView)只占用屏幕的一半(所以会有常规视图和一个新的视图)。然后我想要一个名为firstView.xib的不同.xib文件并将其加载到containerView中。所以我可以在firstView.xib上有一堆东西和rootView.xib中的一堆不同的东西,并在rootView.xib中加载我的firstView.xib在containerView内,但由于它只占用了屏幕的一半,你仍然可以看到rootView.xib上的东西
答案 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对象上重用的小部件非常有用。
答案 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;下一个
确保勾选“也创建XIB文件”
我想使用tableview
执行,因此我选择了子类UITableViewCell
您可以选择作为您的申请
根据您的意愿设计XIB文件(RestaurantTableViewCell.xib)
我们需要抓住行高来设置表格每行hegiht
现在!需要抓住他们快速文件。我很讨厌restaurantPhoto
和restaurantName
你可以帮到你们所有人。
现在添加UITableView
命名强>
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
}
}
你做完了:)
答案 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)