Bir UIView'de xib dosyası nasıl yüklenir


111

Her yeri arıyordum ve şimdiye kadar hiçbir şey benim için işe yaramadı.

Temel olarak, rootView.xib adında bir .xib dosyasına sahip olmak istiyorum ve içinde ekranın yalnızca yarısını kaplayan bir UIView (buna containerView diyelim) sahip olmak istiyorum (böylece normal görünüm ve yeni bir görünüm olurdu). Sonra firstView.xib adlı farklı bir .xib dosyası istiyorum ve onu containerView içine yüklüyorum. Yani, firstView.xib'de bir sürü şey ve rootView.xib'de bir sürü farklı şey olabilir ve firstView.xib'imi rootView.xib'deki containerView'ın içine yükleyebilirim, ancak ekranın yalnızca yarısını kapladığı için hala rootView.xib'deki şeyler


2
Dikkat edin, bu arayış arkaiktir. Uzun yıllardır, sadece konteyner görünümleri öğreticisini
Şişko

Yanıtlar:


181

Bir xib dosyasından programlı olarak bir nesne almak için şunu kullanabilirsiniz: [[NSBundle mainBundle] loadNibNamed:@"MyXibName" owner:self options:nil]bu, xib'deki üst düzey nesnelerin bir dizisini döndürür.

Yani, şöyle bir şey yapabilirsiniz:

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 efendim bu soru ile ilgili bir sorunuz var. xib'in alt görünümünü slayt menüsü olarak açmak istiyorum. View kontrolcüsünden menü butonuna tıkladığımda sadece alt görünüm (xib'in yarım ekranı) slayt olmalıdır. Mümkünse lütfen yardım edin.
sandeep tomar

İle çalışmaz thisView.alpha = 0, thisView.superview(sıfır gösterir)
Jack

24

Başka bir .xib dosyası içindeki .xib dosyasından bir UIView yüklemek için github üzerinde örnek bir proje oluşturdum. Veya programlı olarak yapabilirsiniz.

Bu, farklı UIViewController nesnelerinde yeniden kullanmak istediğiniz küçük widget'lar için iyidir.

  1. Yeni Yaklaşım: https://github.com/PaulSolt/CustomUIView
  2. Orijinal Yaklaşım: https://github.com/PaulSolt/CompositeXib

.Xib dosyasından bir Özel UIVView yükleyin


Harika kitap, harika çalışıyor! Hala kendin mi kullanıyorsun? :)
AnthoPak

Bu yükleme tekniğini , kahve tarifi başladığında BrewCoffeeApp.com'da özel bir görünüm için bir Storyboard ve XIB dosyasıyla kullanıyorum .
Paul Solt

21

Deneyebilirsin:

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

Tam olarak önerdiğin şey değil. "RootView.xib" in "containerView" adlı ekranın yarısı kadar bir subView boyutuna sahip olacağını söyledi. Ve containerView'a "firstView.xib" ucunun içeriğini yüklemek istedi.
NJones

19

[Swift Uygulaması]

Xib'den görünüm yüklemenin evrensel yolu:

Misal:

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

Uygulama:

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
En son Swift uyarınca:let view = Bundle.main.loadNibNamed(name, owner: nil, options: nil)?.first as? T
s.zainulabideen

6

Bir XIB dosyası oluşturun:

Dosya -> yeni Dosya -> ios-> kakao dokunma sınıfı -> sonraki

görüntü açıklamasını buraya girin

emin olun onay işaretinin "ayrıca XIB dosyası oluştur"

tableviewPerformans yapmak istiyorum, bu yüzden alt sınıf seçtimUITableViewCell

talebiniz olarak seçebilirsiniz

görüntü açıklamasını buraya girin

İsteğinize göre XIB dosyası tasarımı (RestaurantTableViewCell.xib)

görüntü açıklamasını buraya girin

tabloyu her satırın yüksekliğini ayarlamak için satır yüksekliğini almamız gerekir

görüntü açıklamasını buraya girin

Şimdi! onları hızlı bir şekilde sıkıştırmanız gerekiyor. ben mahvoldum restaurantPhotove restaurantNamehepinizi mahvedebilirsiniz.

görüntü açıklamasını buraya girin

Şimdi bir UITableView ekleniyor

görüntü açıklamasını buraya girin

name
.nib uzantısını içermesi gerekmeyen uç dosyasının adı.

owner
Ucun File's Owner nesnesi olarak atanacak nesne.

seçenekler
Uç dosyasını açarken kullanılacak seçenekleri içeren bir sözlük.

ilk önce tanımlamazsanız, sonra tüm görünümü kaparsınız .. bu yüzden o setin içinde bir görünüm yakalamalısınız frist.

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

işte tablo görünümü denetleyicisi Tam kod

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
    }

}

bitirdiniz :)

görüntü açıklamasını buraya girin


1
lütfen söyleyebilir misin neden reddedildi o zaman
sevineceğim

6
Örneğiniz xib yüklemesinden görüntülemek için uygundur. Ama tableView için bu yanlış - yeniden kullanılabilir hücreler doğru yol
Viktor

4

Hızlı 3 ve 4 için

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

2

İçin Swift 4.2

NibView adında bir sınıfınız olduğunu ve ilişkili uç dosyasının NibView.xib olduğunu varsayalım.

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
    }

}

sınıfın bir örneğini oluşturun ve görünümünüze istediğiniz mizanpajınızı ekleyin

let myView = NibView.getScreen()
self.yourView.addSubview(myView)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.