Cara memuat file xib di UIView

111

Saya telah mencari di mana-mana dan sejauh ini tidak ada yang berhasil untuk saya.

Pada dasarnya saya ingin memiliki file .xib bernama rootView.xib dan di dalamnya saya ingin memiliki UIView (sebut saja containerView) yang hanya menempati setengah layar (jadi akan ada tampilan biasa dan tampilan baru). Lalu saya ingin file .xib berbeda bernama firstView.xib dan memuatnya di dalam containerView. Jadi saya dapat memiliki banyak hal di firstView.xib dan banyak hal berbeda di rootView.xib dan memuat firstView.xib saya di dalam containerView di rootView.xib tetapi karena ini hanya mengambil setengah dari layar Anda masih akan melihat hal-hal di rootView.xib

Matt
sumber
2
Catatan, questin ini kuno. Selama bertahun-tahun sekarang, cukup gunakan tutorial
Fattie

Jawaban:

181

Untuk mendapatkan objek dari file xib secara terprogram, Anda dapat menggunakan: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]yang mengembalikan larik objek tingkat atas di xib.

Jadi, Anda bisa melakukan sesuatu seperti ini:

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];
chown
sumber
@PaulSolt Pak saya punya pertanyaan terkait dengan queston ini. saya ingin membuka subview dari xib sebagai menu slide. Ketika saya mengklik tombol menu dari pengontrol tampilan, hanya subview (yang merupakan setengah layar xib) yang harus digeser. tolong bantu jika memungkinkan.
sandeep tomar
Ini tidak bekerja dengan thisView.alpha = 0, thisView.superview(menunjukkan nihil)
Jack
24

Saya membuat proyek sampel di github untuk memuat UIView dari file .xib di dalam file .xib lain. Atau Anda dapat melakukannya secara terprogram.

Ini bagus untuk widget kecil yang ingin Anda gunakan kembali pada objek UIViewController yang berbeda.

  1. Pendekatan Baru: https://github.com/PaulSolt/CustomUIView
  2. Pendekatan Asli: https://github.com/PaulSolt/CompositeXib

Muat UIView Kustom dari file .xib

Paul Solt
sumber
Lib hebat, bagus sekali! Apakah Anda masih menggunakannya sendiri? :)
AnthoPak
Saya menggunakan teknik pemuatan ini dengan file Storyboard dan XIB untuk tampilan kustom di BrewCoffeeApp.com saya ketika resep kopi telah dimulai.
Paul Solt
21

Kamu bisa mencoba:

UIView *firstViewUIView = [[[NSBundle mainBundle] loadNibNamed:@"firstView" owner:self options:nil] firstObject];
[self.view.containerView addSubview:firstViewUIView];
NJones
sumber
Ini tidak persis seperti yang Anda sarankan. Dia mengatakan "rootView.xib" miliknya akan memiliki subView setengah ukuran layar bernama "containerView". Dan ke containerView dia ingin memuat konten pena "firstView.xib" -nya.
NJones
19

[Implementasi Cepat]

Cara universal memuat tampilan dari xib:

Contoh:

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

Penerapan:

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))
    }
}
Максим Мартынов
sumber
1
Sesuai Swift terbaru:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen
6

Buat file XIB:

File -> File baru -> ios-> kelas cocoa touch -> selanjutnya

masukkan deskripsi gambar di sini

pastikan tanda centang "juga buat file XIB"

Saya ingin tampil bersama tableviewjadi saya memilih subclassUITableViewCell

Anda dapat memilih sebagai permintaan Anda

masukkan deskripsi gambar di sini

File XIB mendesain sesuai keinginan Anda (RestaurantTableViewCell.xib)

masukkan deskripsi gambar di sini

kita perlu mengambil tinggi baris untuk mengatur tabel setiap baris hegiht

masukkan deskripsi gambar di sini

Sekarang! perlu menyimpan file cepat mereka. Saya terselubung restaurantPhotodan restaurantNameAnda bisa menipu Anda semua.

masukkan deskripsi gambar di sini

Sekarang menambahkan UITableView

masukkan deskripsi gambar di sini

name
Nama file nib, yang tidak perlu menyertakan ekstensi .nib.

owner
Objek yang akan ditetapkan sebagai objek File's Owner nib.

options
Kamus yang berisi opsi untuk digunakan saat membuka file ujung pena.

pertama jika Anda tidak mendefinisikan terlebih dahulu kemudian mengambil semua tampilan .. jadi Anda perlu mengambil satu tampilan di dalam set itu frist.

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

berikut adalah pengontrol tampilan tabel Kode lengkap

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
    }

}

Kamu sudah selesai :)

masukkan deskripsi gambar di sini

Nazmul Hasan
sumber
1
bisa tolong beritahu. mengapa turun memilih maka saya akan senang
Nazmul Hasan
6
Contoh Anda baik-baik saja untuk dilihat dari pemuatan xib. Tapi untuk tableView itu salah - sel yang dapat digunakan kembali adalah cara yang benar
Viktor
4

Untuk swift 3 & 4

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

Untuk Swift 4.2

Anggaplah Anda memiliki kelas bernama NibView dan file ujung terkait adalah 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
    }

}

buat instance kelas dan tambahkan tampilan Anda dengan tata letak spesifik apa pun yang Anda inginkan

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Noshaid Ali
sumber