2011-10-18 25 views
91

Tôi đã tìm kiếm ở khắp mọi nơi và không có gì cho đến nay đã làm việc cho tôi. Về cơ bản tôi muốn có một tập tin .xib được gọi là rootView.xib và bên trong nó tôi muốn có một UIView (cho phép 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à một xem mới). Sau đó, tôi muốn một tập tin .xib khác gọi là firstView.xib và tải nó bên trong containerView. Vì vậy, tôi có thể có một loạt các công cụ trên firstView.xib và một loạt các công cụ 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 của màn hình, bạn vẫn sẽ thấy công cụ trên rootView.xibLàm thế nào để tải một tập tin xib trong một UIView

+2

Note, questin này là cổ xưa. Trong nhiều năm nay, chỉ cần sử dụng chế độ xem vùng chứa [hướng dẫn] (http://stackoverflow.com/questions/23399061/objective-c-how-to-add-a-subview-that-has-its-own-uiviewcontroller/23403979 # 23403979) – Fattie

Trả lời

162

Để lấy đố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] 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ư thế này:

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

@Matt Thanh toán giải pháp của tôi trên github. https://github.com/PaulSolt/CompositeXib –

+0

@PaulSolt sir tôi có một truy vấn liên quan đến queston này. tôi muốn mở subview của xib như trình đơn slide. Khi tôi bấm vào nút menu từ trình điều khiển xem chỉ subview (đó là một nửa màn hình của xib) nên được trượt. xin vui lòng giúp đỡ nếu nó có thể. –

+0

Nó không hoạt động với 'thisView.alpha = 0',' thisView.superview' (cho thấy nil) – Jack

13

Bạn có thể thử:

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

Nó không chính xác những gì bạn đề nghị. Ông nói rằng "rootView.xib" của mình sẽ có một subView một nửa kích thước của màn hình có tên là "containerView". Và vào containerView, ông muốn tải nội dung của nib "firstView.xib" của mình. – NJones

23

Tôi tạo ra một dự án mẫu trên github để tải một UIView từ một tập tin .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 phù hợp cho các tiện ích con bạn muốn sử dụng lại trên các đối tượng UIViewController khác nhau.

  1. New Approach: https://github.com/PaulSolt/CustomUIView
  2. gốc Cách tiếp cận: https://github.com/PaulSolt/CompositeXib

Load a Custom UIView from .xib file

7

[Swift thực hiện]

cách phổ quát của xem tải từ xib:

Ví dụ:

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

Thực hiện:

extension NSBundle { 

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

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

Tạo một file XIB:

File -> mới File -> ios-> cacao lớp cảm ứng -> tiếp theo

enter image description here

chắc chắn dấu kiểm "cũng tạo file XIB"

Tôi muốn thực hiện với tableview vì vậy tôi chọn lựa lớp con UITableViewCell

bạn có thể chọn như requerment bạn

enter image description here

tập XIB desing như mong muốn của bạn (RestaurantTableViewCell.xib)

enter image description here

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

enter image description here

Now! cần phải giấu chúng nhanh chóng. tôi đang giấu restaurantPhotorestaurantName bạn có thể giấu tất cả các bạn.

enter image description here

Bây giờ thêm một UITableView

enter image description here

tên
Tên của tập tin nib, mà không cần phải có đuôi tên miền .nib.

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

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

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

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

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

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 thực hiện :)

enter image description here

+0

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

+4

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

Các vấn đề liên quan