วิธีโหลดไฟล์ xib ใน UIView


111

ฉันได้ค้นหาทุกที่และจนถึงตอนนี้ก็ไม่มีอะไรได้ผลสำหรับฉัน

โดยทั่วไปฉันต้องการมีไฟล์. xib ที่เรียกว่า rootView.xib และภายในนั้นฉันต้องการมี UIView (เรียกว่า containerView) ที่ใช้เวลาเพียงครึ่งหนึ่งของหน้าจอ (ดังนั้นจะมีมุมมองปกติและมุมมองใหม่) จากนั้นฉันต้องการไฟล์. xib อื่นที่เรียกว่า firstView.xib และโหลดภายใน containerView ดังนั้นฉันสามารถมีหลายอย่างใน firstView.xib และสิ่งต่าง ๆ มากมายใน rootView.xib และโหลด firstView.xib ของฉันภายใน containerView ใน rootView.xib แต่เนื่องจากใช้เวลาเพียงครึ่งหนึ่งของหน้าจอคุณจึงยังคงเห็น สิ่งต่างๆบน rootView.xib


2
หมายเหตุเควสนี้เป็นแบบโบราณ เป็นเวลาหลายปีแล้วเพียงใช้บทแนะนำเกี่ยวกับ
Fattie

คำตอบ:


181

ในการรับวัตถุจากไฟล์ 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) ควรจะสไลด์ โปรดช่วยถ้าเป็นไปได้
sandeep tomar

มันไม่ได้ทำงานร่วมกับ thisView.alpha = 0, thisView.superview(แสดงให้เห็นว่าไม่มี)
แจ็ค

24

ฉันสร้างโปรเจ็กต์ตัวอย่างบน github เพื่อโหลด UIView จากไฟล์. xib ภายในไฟล์. xib อื่น หรือจะทำแบบเป็นโปรแกรมก็ได้

นี่เป็นสิ่งที่ดีสำหรับวิดเจ็ตเล็ก ๆ ที่คุณต้องการใช้ซ้ำกับวัตถุ UIViewController ต่างๆ

  1. แนวทางใหม่: https://github.com/PaulSolt/CustomUIView
  2. แนวทางดั้งเดิม: https://github.com/PaulSolt/CompositeXib

โหลด Custom UIView จากไฟล์. xib


เยี่ยมมากใช้งานได้ดี! คุณยังใช้เองอยู่หรือเปล่า? :)
AnthoPak

ฉันใช้เทคนิคการโหลดนี้กับ Storyboard และไฟล์ XIB สำหรับมุมมองที่กำหนดเองในBrewCoffeeApp.comของฉันเมื่อสูตรกาแฟเริ่มต้นขึ้น
Paul Solt

21

คุณสามารถลอง:

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

ไม่ใช่สิ่งที่คุณแนะนำอย่างแม่นยำ เขากล่าวว่า "rootView.xib" ของเขาจะมี subView ขนาดครึ่งหนึ่งของหน้าจอชื่อ "containerView" และใน containerView เขาต้องการโหลดเนื้อหาของปลายปากกา "firstView.xib" ของเขา
NJones

19

[การใช้งานอย่างรวดเร็ว]

วิธีทั่วไปในการโหลดมุมมองจาก 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))
    }
}

1
ตาม Swift ล่าสุด:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

สร้างไฟล์ XIB:

ไฟล์ -> ไฟล์ใหม่ -> ios-> คลาสสัมผัสโกโก้ -> ถัดไป

ใส่คำอธิบายภาพที่นี่

ตรวจสอบให้แน่ใจว่าเครื่องหมายถูก "สร้างไฟล์ XIB ด้วย"

ฉันต้องการแสดงด้วยtableviewดังนั้นฉันจึงเลือกคลาสย่อยUITableViewCell

คุณสามารถเลือกเป็นคำขอของคุณ

ใส่คำอธิบายภาพที่นี่

ไฟล์ XIB ตามที่คุณต้องการ (RestaurantTableViewCell.xib)

ใส่คำอธิบายภาพที่นี่

เราจำเป็นต้องคว้าความสูงของแถวเพื่อกำหนดตารางแต่ละแถวให้สูงขึ้น

ใส่คำอธิบายภาพที่นี่

ตอนนี้! จำเป็นต้องซ่อนไฟล์ที่รวดเร็ว ฉันซ่อนตัวrestaurantPhotoและrestaurantNameคุณสามารถกอดพวกคุณทั้งหมดได้

ใส่คำอธิบายภาพที่นี่

ตอนนี้เพิ่ม UITableView

ใส่คำอธิบายภาพที่นี่

name
ชื่อของไฟล์ nib ซึ่งไม่จำเป็นต้องมีนามสกุล. nib

owner
วัตถุที่จะกำหนดให้เป็นวัตถุเจ้าของไฟล์ของปลายปากกา

ตัวเลือก
พจนานุกรมที่มีตัวเลือกที่จะใช้เมื่อเปิดไฟล์จะงอยปาก

อันดับแรก หากคุณไม่กำหนดก่อนจากนั้นจึงคว้าทุกมุมมอง .. ดังนั้นคุณต้องคว้ามุมมองหนึ่งภายในชุด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
    }

}

คุณทำเสร็จแล้ว :)

ใส่คำอธิบายภาพที่นี่


1
คุณช่วยบอกได้ไหม ทำไมโหวตลงแล้วฉันจะดีใจ
Nazmul Hasan

6
ตัวอย่างของคุณใช้ได้สำหรับการดูจากการโหลด xib แต่สำหรับ tableView มันผิด - เซลล์ที่ใช้ซ้ำได้คือวิธีที่ถูกต้อง
Viktor


2

สำหรับSwift 4.2.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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.