Cách tải tệp xib trong UIView


111

Tôi đã tìm kiếm khắp nơi và cho đến nay vẫn chưa có gì phù hợp với tôi.

Về cơ bản, tôi muốn có một tệp .xib được gọi là rootView.xib và bên trong nó, tôi muốn có một UIView (hãy gọi nó là containerView) chỉ chiếm một nửa màn hình (vì vậy sẽ có chế độ xem thông thường và chế độ xem mới). Sau đó, tôi muốn một tệp .xib khác được gọi là firstView.xib và tải nó vào bên trong containerView. Vì vậy, tôi có thể có nhiều thứ trên firstView.xib và nhiều thứ khác nhau trong rootView.xib và tải firstView.xib của tôi bên trong containerView trong rootView.xib nhưng vì nó chỉ chiếm một nửa màn hình nên bạn vẫn sẽ thấy nội dung trên rootView.xib


2
Lưu ý, câu hỏi này là cổ xưa. Trong nhiều năm nay, chỉ cần sử dụng quan điểm chứa hướng dẫn
Fattie

Câu trả lời:


181

Để lấy một đối tượng từ tệp xib theo chương trình, bạn có thể sử dụng: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil] này trả về một mảng các đối tượng cấp cao nhất trong xib.

Vì vậy, bạn có thể làm điều gì đó như sau:

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 thưa ông, tôi có một truy vấn liên quan đến nhiệm vụ này. tôi muốn mở subview của xib dưới dạng menu slide. Khi tôi nhấp vào nút menu từ bộ điều khiển chế độ xem, chỉ có chế độ xem phụ (là một nửa màn hình của xib) sẽ được trượt. xin vui lòng giúp đỡ nếu nó có thể.
sandeep tomar

Nó không hoạt động với thisView.alpha = 0, thisView.superview(hiển thị số không)
Jack

24

Tôi đã tạo một dự án mẫu trên github để tải UIView từ tệp .xib bên trong tệp .xib khác. Hoặc bạn có thể làm điều đó theo chương trình.

Điều này tốt cho các widget nhỏ mà bạn muốn sử dụng lại trên các đối tượng UIViewController khác nhau.

  1. Phương pháp tiếp cận mới: https://github.com/PaulSolt/CustomUIView
  2. Phương pháp tiếp cận ban đầu: https://github.com/PaulSolt/CompositeXib

Tải UIView tùy chỉnh từ tệp .xib


Tuyệt vời lib, hoạt động tuyệt vời! Bạn vẫn đang sử dụng nó cho mình? :)
AnthoPak

Tôi sử dụng kỹ thuật tải này với Storyboard và tệp XIB để có chế độ xem tùy chỉnh trong BrewCoffeeApp.com của tôi khi công thức cà phê đã bắt đầu.
Paul Solt

21

Bạn có thể thử:

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

Đó không phải là chính xác những gì bạn đề xuất. Anh cho biết "rootView.xib" của anh sẽ có một subView có kích thước bằng một nửa màn hình có tên "containerView". Và vào containerView, anh ấy muốn tải nội dung của nib "firstView.xib".
NJones

19

[Triển khai Swift]

Cách phổ biến để tải chế độ xem từ xib:

Thí dụ:

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

Thực hiện:

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
Theo Swift mới nhất:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

Tạo tệp XIB:

Tệp -> Tệp mới -> ios-> lớp cảm ứng ca cao -> tiếp theo

nhập mô tả hình ảnh ở đây

đảm bảo dấu kiểm "cũng tạo tệp XIB"

Tôi muốn biểu diễn với tableviewvì vậy tôi đã chọn lớp phụUITableViewCell

bạn có thể chọn làm yêu cầu của mình

nhập mô tả hình ảnh ở đây

Định hướng tệp XIB theo mong muốn của bạn (RestaurantTableViewCell.xib)

nhập mô tả hình ảnh ở đây

chúng ta cần lấy chiều cao hàng để đặt bảng mỗi hàng hegiht

nhập mô tả hình ảnh ở đây

Hiện nay! cần phải giấu chúng một cách nhanh chóng. tôi đang giấu restaurantPhotorestaurantNamebạn có thể giấu tất cả các bạn.

nhập mô tả hình ảnh ở đây

Hiện đang thêm UITableView

nhập mô tả hình ảnh ở đây

tên
Tên của tệp nib, không cần bao gồm phần mở rộng .nib.

chủ sở hữu
Đối tượng để gán làm đối tượng Chủ sở hữu tệp của nib.

tùy chọn
Một từ điển chứa các tùy chọn để sử dụng khi mở tệp nib.

đầu tiên nếu bạn không xác định trước thì lấy tất cả các chế độ xem .. vì vậy bạn cần lấy một chế độ xem bên trong tập hợp đó frist.

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

đây là bộ điều khiển xem bảng Mã đầy đủ

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
    }

}

bạn đã hoàn thành :)

nhập mô tả hình ảnh ở đây


1
bạn có thể cho tôi biết. tại sao xuống bình chọn sau đó tôi sẽ vui mừng
Nazmul Hasan

6
Ví dụ của bạn là ok để xem từ tải xib. Nhưng đối với tableView nó sai - tế bào tái sử dụng được cách chính xác
Viktor

4

Đối với nhanh 3 & 4

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

2

Đối với Swift 4.2

Giả sử bạn có một lớp có tên NibView và tệp nib được liên kết là 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
    }

}

tạo một phiên bản của lớp và thêm vào chế độ xem của bạn với bố cục cụ thể của bạn bất kỳ thứ gì bạn muốn

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.