Nasıl XIb'nin dosyalarından özel UITableViewCells yüklerim?

oy
278

Soru basit: Nasıl özel yüklerim UITableViewCellXIb'nin dosyalarından? Bunu yapmanız, hücreleri tasarlamak için Interface Builder kullanmasına olanak sağlar. Cevap görünüşe bağlı bellek yönetimi konularına basit değildir. Bu iplik sorunu bahseder ve bir çözüm önerir, ancak bir ön NDA-salım ve kod yoksundur. İşte bu uzun iplik kesin bir cevap vermeden konuyu tartışmaktadır.

İşte kullandım bazı kod:

static NSString *CellIdentifier = @MyCellIdentifier;

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = (MyCell *)[nib objectAtIndex:0];
}

Bu kodu kullanmak için, MyCell.m / .h, yeni bir alt sınıfı oluşturmak UITableViewCellve eklemek IBOutletsistediğiniz bileşenleri için. Sonra yeni Boş XIB dosyası oluşturun. , IB XIb'nin dosyasını açın bir ekleme UITableViewCellnesnesi, MyCellIdentifier onun tanımlayıcı ayarlayın ve MyCell onun sınıfını ayarlayın ve bileşenleri ekleyin. Son olarak, bağlantı IBOutletsbileşenlerine. Biz IB Dosyanın Sahibi set vermedi unutmayın.

Diğer yöntemler Dosyanın Sahibi kurulmasından yana ve XIb'nin ek bir fabrika sınıfının aracılığı yüklü değilse, hafıza sızıntıları uyarır. Ben Aletler / Kaçaklar altında yukarıda test edilmiş ve hiçbir bellek sızıntılarını gördük.

Yani Xibs hücreleri yüklemek için kurallı yolu nedir? Biz Dosyanın Sahibi ayarlarım? Biz bir fabrika gerekir mi? Eğer öyleyse, fabrika için kod benziyor ne? Birden çözümler varsa, onlardan her birinin olumlu ve olumsuz yanlarını açıklamak istiyoruz ...

Oluştur 12/02/2009 saat 08:27
kaynak kullanıcı
Diğer dillerde...                            


23 cevaplar

oy
292

doğru çözüm şudur:

- (void)viewDidLoad
{
 [super viewDidLoad];
 UINib *nib = [UINib nibWithNibName:@"ItemCell" bundle:nil];
 [[self tableView] registerNib:nib forCellReuseIdentifier:@"ItemCell"];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // Create an instance of ItemCell
   PointsItemCell *cell =  [tableView dequeueReusableCellWithIdentifier:@"ItemCell"];

return cell;
}
Cevap 29/11/2012 saat 16:57
kaynak kullanıcı

oy
282

İşte iki yöntem vardır asıl yazar devletler bir IB mühendis tarafından tavsiye edilmiştir .

Daha fazla ayrıntı için asıl yayınına bakın. daha basit göründüğü gibi ben yöntem 2. tercih ederim.

Yöntem 1:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Create a temporary UIViewController to instantiate the custom cell.
        UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"BDCustomCell" bundle:nil];
        // Grab a pointer to the custom cell.
        cell = (BDCustomCell *)temporaryController.view;
        [[cell retain] autorelease];
        // Release the temporary UIViewController.
        [temporaryController release];
    }

    return cell;
}

Yöntem # 2:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"BDCustomCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
    }

    return cell;
}

Güncelleme (2014): Yöntem 2. halen geçerli ancak bunun için hiçbir belge artık yoktur. O olmak için kullanılan resmi dokümanlar ama şimdi storyboardlar lehine kaldırılır.

Ben Github bir çalışma örneği yayınladı:
https://github.com/bentford/NibTableCellExample

Cevap 21/12/2009 saat 11:19
kaynak kullanıcı

oy
33

Kayıt olmak

IOS 7 sonra bu süreç (aşağı basitleştirildi hızlı 3.0 ):

// For registering nib files
tableView.register(UINib(nibName: "MyCell", bundle: Bundle.main), forCellReuseIdentifier: "cell")

// For registering classes
tableView.register(MyCellClass.self, forCellReuseIdentifier: "cell")

( Not Bu aynı zamanda hücrelerin oluşturarak elde edilebilir) .xibya da .stroyboardprototip hücreleri gibi, dosya. Onlara bir sınıf eklemek gerekirse, hücre prototip seçip (soyundan olmalıdır ilgili sınıf ekleyebilir UITableViewCellelbette).

Dequeue

Ve daha sonra, (kullanarak dequeued hızlı 3,0 ):

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = "Hello"

    return cell
}

Var olmayan (yani yapmanız gerekmez anlamına geliyorsa, bu yeni yöntem hücreyi dequeues sadece aradaki fark, aynı zamanda yaratır if (cell == nil)maskaralık) ve hücre yukarıdaki örnekte olduğu gibi sadece kullanıma hazırdır.

( Uyarı ) tableView.dequeueReusableCell(withIdentifier:for:)Eğer (olmadan diğerini ararsanız, yeni davranışa sahip indexPath:sizden için kontrol edilmesi gereken hangi eski davranış olsun) nilKendini ve örnek He got fark UITableViewCell?dönüş değeri.

if let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MyCellClass
{
    // Cell be casted properly
    cell.myCustomProperty = true
}
else
{
    // Wrong type? Wrong identifier?
}

Ve tabii ki, hücrenin ilişkili sınıfın türü için .xib dosyasında tanımlanan biridir UITableViewCelldiğer kayıt yöntemi kullanılarak, alternatif olarak alt sınıf veya.

Yapılandırma

İdeal olarak, hücreler zaten bunları kayıtlı zaman görünümü ve (etiket ve resim görünümleri gibi) içerik konumlandırma açısından yapılandırılmış ve üzerindeki cellForRowAtIndexPathyöntemde sadece onlara bilgi verir.

Hep birlikte

class MyCell : UITableViewCell
{
    // Can be either created manually, or loaded from a nib with prototypes
    @IBOutlet weak var labelSomething : UILabel? = nil
}

class MasterViewController: UITableViewController 
{
    var data = ["Hello", "World", "Kinda", "Cliche", "Though"]

    // Register
    override func viewDidLoad()
    {
        super.viewDidLoad()

        tableView.register(MyCell.self, forCellReuseIdentifier: "mycell")
        // or the nib alternative
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return data.count
    }

    // Dequeue
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "mycell", for: indexPath) as! MyCell

        cell.labelSomething?.text = data[indexPath.row]

        return cell
    }
}

Ve tabii ki, bu aynı adlara sahip objc tüm mevcuttur.

Cevap 21/05/2015 saat 01:47
kaynak kullanıcı

oy
32

Shawn Craver cevabını aldı ve biraz temizledim.

BBCell.h:

#import <UIKit/UIKit.h>

@interface BBCell : UITableViewCell {
}

+ (BBCell *)cellFromNibNamed:(NSString *)nibName;

@end

BBCell.m:

#import "BBCell.h"

@implementation BBCell

+ (BBCell *)cellFromNibNamed:(NSString *)nibName {
    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];
    NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
    BBCell *customCell = nil;
    NSObject* nibItem = nil;
    while ((nibItem = [nibEnumerator nextObject]) != nil) {
        if ([nibItem isKindOfClass:[BBCell class]]) {
            customCell = (BBCell *)nibItem;
            break; // we have a winner
        }
    }
    return customCell;
}

@end

Ben BBCell hayatım UITableViewCell en alt sınıfları olun ve sonra standardının yerini

cell = [[[BBDetailCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"BBDetailCell"] autorelease];

ile:

cell = (BBDetailCell *)[BBDetailCell cellFromNibNamed:@"BBDetailCell"];
Cevap 22/06/2010 saat 03:15
kaynak kullanıcı

oy
15

Ben bentford en kullanılan Yöntem 2. :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BDCustomCell"];
    if (cell == nil) {
        // Load the top-level objects from the custom cell XIB.
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"BDCustomCell" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that's all the XIB should contain).
        cell = [topLevelObjects objectAtIndex:0];
    }

    return cell;
}

Çalışır, ancak bağlantıları için dikkat Dosyanın Sahibinin özel UITableViewCell .xib dosyasında.

Geçerek owner:selfsizin de loadNibNamedaçıklamada, ayarladığınızUITableViewController aramalarınızdan Dosyanın Sahibi olarak UITableViewCell.

Eğer sürükleyip eylem ve çıkışları kurmak için IB başlık dosyasına düşerse varsayılan olarak Dosyanın sahibi olarak onları kuracak.

Olarak loadNibNamed:owner:options, Apple'ın kod Aşağıdaki yerlerde de özellikleri ayarlamak için çalışacağız UITableViewControllero sahibi olduğu,. Ama bu özellikleri vardır tanımlanmış yok, bu yüzden olma konusunda bir hata alıyorum kodlama uyumlu anahtar değeri :

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason:     '[<MyUITableViewController 0x6a383b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key myLabel.'

Olay yerine tetiklendiğinde ise, bir NSInvalidArgumentException alırsınız:

-[MyUITableViewController switchValueDidChange:]: unrecognized selector sent to instance 0x8e9acd0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyUITableViewController switchValueDidChange:]: unrecognized selector sent to instance 0x8e9acd0'
*** First throw call stack:
(0x1903052 0x15eed0a 0x1904ced 0x1869f00 0x1869ce2 0x1904ec9 0x5885c2 0x58855a 0x62db76 0x62e03f 0x77fa6c 0x24e86d 0x18d7966 0x18d7407 0x183a7c0 0x1839db4 0x1839ccb 0x1f8b879 0x1f8b93e 0x585a9b 0xb904d 0x2c75)
terminate called throwing an exceptionCurrent language:  auto; currently objective-c

Kolay bir geçici çözüm adresinden Arayüz Oluşturucu bağlantılarını işaret etmek UITableViewCellyerine Dosyanın Sahibi:

  1. bağlantıların listesini açmak için Dosyanın Sahibinin sağ tıklayın
  2. Command-Shift-4 ile ekran görüntüsü alabilir (alanını seçmek için sürükle çekilecek)
  3. Dosyanın Sahibinden x dışarı bağlantıları
  4. Sağ Nesne hiyerarşisinde UITableCell tıklayın ve bağlantıları yeniden ekleyin.
Cevap 19/03/2012 saat 22:41
kaynak kullanıcı

oy
12

Ben bu cevapların hiçbirini beğenmedim çünkü göndermeye karar verdim - şeyler her zaman daha basit olabilir ve bu kadar buldum en özlü bir yoldur.

Hoşuna olarak 1. Interface Builder sizin xib oluşturun

  • sınıf NSObject ayarlayın dosya'nın sahibi
  • Bir UITableViewCell ekleyin ve MyTableViewCellSubclass onun sınıfını ayarlayın - senin IB çökerse (Xcode olur> 4 Bu yazının) Xcode 4 arayüzünü do hala etrafında döşeme varsa, sadece bir UIView kullanmak
  • (.m benim tercih) sizin subviews bu hücrenin içinde Pafta ve .h veya .m içinde @interface için IBOutlet bağlantıları takmak

senin UIViewController veya UITableViewController alt sınıfında 2.

@implementation ViewController

static NSString *cellIdentifier = @"MyCellIdentier";

- (void) viewDidLoad {

    ...
    [self.tableView registerNib:[UINib nibWithNibName:@"MyTableViewCellSubclass" bundle:nil] forCellReuseIdentifier:cellIdentifier];
}

- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCellSubclass *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    ...

    return cell;
}

senin MyTableViewCellSubclass 3.

- (id) initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        ...
    }

    return self;
}
Cevap 26/08/2013 saat 09:18
kaynak kullanıcı

oy
8

Eğer hücreler yapmak Interface Builder kullanıyorsanız, size Inspector'da Identifier kurdum olmadığını kontrol edin. Sonra dequeueReusableCellWithIdentifier çağrılırken aynı olduğunu kontrol edin.

Ben yanlışlıkla bir tablo ağır projede bazı tanımlayıcıları kurmayı unuttuğu ve Performans değişikliğinde gece ve gündüz gibi oldu.

Cevap 28/04/2010 saat 11:55
kaynak kullanıcı

oy
7

XIBs yükleniyor UITableViewCells bir sürü kod kaydeder, ancak genellikle korkunç kaydırma hızı (aslında, XIB ama bu neden UIViews aşırı kullanımı değil) ile sonuçlanır.

Bunu bakmak öneririz: Bağlantı başvurusu

Cevap 12/02/2009 saat 15:19
kaynak kullanıcı

oy
5

Burada XIBs dışına özel hücrelerini oluşturmak için kullanıyorum sınıf bir yöntem vardır:

+ (CustomCell*) createNewCustomCellFromNib {

    NSArray* nibContents = [[NSBundle mainBundle]
                            loadNibNamed:@"CustomCell" owner:self options:NULL];

    NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
    CustomCell *customCell= nil;
    NSObject* nibItem = nil;

    while ( (nibItem = [nibEnumerator nextObject]) != nil) {

        if ( [nibItem isKindOfClass: [CustomCell class]]) {
            customCell = (CustomCell*) nibItem;

            if ([customCell.reuseIdentifier isEqualToString: @"CustomCell"]) {
                break; // we have a winner
            }
            else
                fuelEntryCell = nil;
        }
    }
    return customCell;
}

Ardından, XIB'nin içinde, ben sınıf adını ve yeniden tanımlayıcı ayarlayın. Bundan sonra, sadece yerine benim görünümü denetleyicisi bu yöntemi çağırabilirsiniz

[[UITableViewCell] alloc] initWithFrame:]

Bu bol yeterince hızlı, ve benim nakliye uygulamalarının ikisinde kullanılıyor. Bu çağırarak daha güvenilir olduğunu [nib objectAtIndex:0]ve sadece sağ türüdür bir XIB'nin dışında bir görünüm kapmak için aklımda hiç olmazsa, Stephan Burlot en Örneğin daha güvenilir garantili çünkü.

Cevap 12/02/2009 saat 14:47
kaynak kullanıcı

oy
4

Doğru Çözüm şudur

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomCell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell  *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
    return cell; 
    }
Cevap 07/09/2016 saat 08:33
kaynak kullanıcı

oy
3

- Bu kontrol http://eppz.eu/blog/custom-uitableview-cell/ : - kontrolör uygulanmasında bir satır biter küçücük sınıfını kullanarak gerçekten uygun bir yol

-(UITableViewCell*)tableView:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath
{
    return [TCItemCell cellForTableView:tableView
                          atIndexPath:indexPath
                      withModelSource:self];
}

Burada görüntü açıklama girin

Cevap 09/07/2013 saat 10:18
kaynak kullanıcı

oy
3

NIB Yeniden Yükleme pahalıdır. Daha sonra, bir kez yüklemek bir hücre gerektiğinde nesne örneğini oluşturmak için. Hata 10580062 ": aşırı kısıtlayıcı iOS5 tableView registerNib" - Apple'ın "registerNIB" iOS5 tek üst düzey nesnesini verir (bu yöntemi kullanarak, kalem ucuna bile birden çok hücre UIImageViews vb ekleyebileceğinizi unutmayın

Yani benim kod aşağıda - benim yaptığım ilklendir gibi veya viewDidLoad (bir kez ELVES okumak -.. Ne olursa olsun O andan itibaren, o zaman gereken bir seçim nesneler içine ucunu örneğini Bu çok daha verimli ve ucun yükleniyor daha tekrar ve tekrar.

static UINib *cellNib;

+ (void)initialize
{
    if(self == [ImageManager class]) {
        cellNib = [UINib nibWithNibName:@"ImageManagerCell" bundle:nil];
        assert(cellNib);
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"TheCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if(cell == nil) {
        NSArray *topLevelItems = [cellNib instantiateWithOwner:nil options:nil];
        NSUInteger idx = [topLevelItems indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)
                            {
                                UITableViewCell *cell = (UITableViewCell *)obj;
                                return [cell isKindOfClass:[UITableViewCell class]] && [cell.reuseIdentifier isEqualToString:cellID];
                            } ];
        assert(idx != NSNotFound);
        cell = [topLevelItems objectAtIndex:idx];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"Howdie %d", indexPath.row];

    return cell;
}
Cevap 14/12/2011 saat 20:01
kaynak kullanıcı

oy
2

İlk özel hücre dosyasını içe #import "CustomCell.h"ve aşağıda belirtilen şekilde daha sonra temsilci yöntemini değiştirmek:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

     return cell;
}
Cevap 26/02/2014 saat 07:48
kaynak kullanıcı

oy
2

bunu yapmak için doğru yolu bir UITableViewCell alt sınıf uygulaması, başlık ve XIB'ye yaratmaktır. XIB'nin herhangi görünümleri kaldırmak ve sadece bir tablo hücresini ekleyin. UITableViewCell alt sınıfının adı olarak sınıfını ayarlayın. dosya sahibi için bu UITableViewController alt sınıf sınıf adı olun. tableViewCell prizi kullanmayı hücreye dosya sahibini bağlayın.

başlık dosyasında:

UITableViewCell *_tableViewCell;
@property (assign) IBOutlet UITableViewCell *tableViewCell;

uygulama dosyasında:

@synthesize tableViewCell = _tableViewCell;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *kCellIdentifier = @"reusableCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:kCellIdentifier owner:self options:nil];
        cell = _tableViewCell;
        self.tableViewCell = nil;
    }

    return cell;
}
Cevap 28/06/2012 saat 22:57
kaynak kullanıcı

oy
2

Ne Bunun için yapmanız bir beyan olduğunu IBOutlet UITableViewCell *cellDenetleyiciniz sınıfında. Daha sonra çağırmak NSBundle loadNibNamedbesleyecek sınıf yöntemi UITableViewCellYukarıda belirtilen hücreye.

Xib için boş bir xib yaratacak ve eklemek UITableViewCellgerektiği gibi kurulum olabilir nerede IB nesne. Bu, daha sonra hücreye bağlanır IBOutletkontrol sınıfında.

- (UITableViewCell *)tableView:(UITableView *)table
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%@ loading RTEditableCell.xib", [self description] );

    static NSString *MyIdentifier = @"editableCellIdentifier";
    cell = [table dequeueReusableCellWithIdentifier:MyIdentifier];

    if(cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"RTEditableCell"
                                      owner:self
                                    options:nil];
    }

    return cell;
}

NSBundle eklemeler loadNibNamed (ADC giriş)

cocoawithlove.com makale ben den kavramını (telefon numaraları örnek uygulamayı al) kaynaklı

Cevap 12/02/2009 saat 19:01
kaynak kullanıcı

oy
1

In Swift 4.2 ve Xcode 10

Üç XIB hücre dosyaları var

ViewDidLoad böyle senin XIB dosyaları kayıt ...

Bu ilk yaklaşımdır

tableView.register(UINib.init(nibName: "XIBCell", bundle: nil), forCellReuseIdentifier: "cell1")
tableView.register(UINib.init(nibName: "XIBCell2", bundle: nil), forCellReuseIdentifier: "cell2")
//tableView.register(UINib.init(nibName: "XIBCell3", bundle: nil), forCellReuseIdentifier: "cell3")

İkinci yaklaşım doğrudan XIB dosyalarını kaydetmek cellForRowAt indexPath:

Bu benim tableview temsilci fonksiyonları olan

//MARK: - Tableview delegates
override func numberOfSections(in tableView: UITableView) -> Int {

    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return 6
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //This is first approach
    if indexPath.row == 0 {//Load first XIB cell
        let placeCell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! XIBCell
        return placeCell
    //Second approach
    } else if indexPath.row == 5 {//Load XIB cell3
        var cell = tableView.dequeueReusableCell(withIdentifier:"cell3") as? XIBCell3
        if cell == nil{
            let arrNib:Array = Bundle.main.loadNibNamed("XIBCell3",owner: self, options: nil)!
            cell = arrNib.first as? XIBCell3
        }

        //ADD action to XIB cell button
        cell?.btn.tag = indexPath.row//Add tag to button
        cell?.btn.addTarget(self, action: #selector(self.bookbtn1(_:)), for: .touchUpInside);//selector

        return cell!
    //This is first approach
    } else {//Load XIB cell2
        let placeCell = tableView.dequeueReusableCell(withIdentifier: "cell2") as! XIBCell2

        return placeCell
    }

}
Cevap 12/10/2018 saat 07:02
kaynak kullanıcı

oy
1
  1. Kendi özelleştirilmiş sınıf oluşturma AbcViewCellgelen alt sınıfı UITableViewCell(sınıf dosya adı ve uç dosya adı aynı olduğundan emin olun)

  2. Bu uzantı sınıf yöntemi oluşturun.

    extension UITableViewCell {
        class func fromNib<T : UITableViewCell>() -> T {
            return Bundle.main.loadNibNamed(String(describing: T.self), owner: nil, options: nil)?[0] as! T
        }
    }
    
  3. kullan.

    let cell: AbcViewCell = UITableViewCell.fromNib()

Cevap 07/09/2017 saat 04:07
kaynak kullanıcı

oy
1

Bir standart bir yol olup olmadığını bilmiyorum, ama burada benim bir yöntem vardır:

  • Bir ViewController için xib oluştur
  • UIViewController Dosya Sahibi sınıfını ayarlama
  • görünümü silme ve bir UITableViewCell eklemek
  • Özel sınıfına sizin UITableViewCell Sımfını ayarlayın
  • senin UITableViewCell ait Identifier ayarlayın
  • senin UITableViewCell için görünüm denetleyicisi bakış çıkışını ayarlayın

Ve bu kodu kullanın:

MyCustomViewCell *cell = (MyCustomViewCell *)[_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
  UIViewController* c = [[UIViewController alloc] initWithNibName:CellIdentifier bundle:nil];
  cell = (MyCustomViewCell *)c.view;
  [c release];
}

Örnekte kullanılarak

[nib objectAtIndex:0]

Elma xib öğelerin sırasını değiştirir kırılabilir.

Cevap 12/02/2009 saat 10:03
kaynak kullanıcı

oy
0
 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cellReuseIdentifier = "collabCell"
            var cell:collabCell! = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as? collabCell
            if cell == nil {
                tableView.register(UINib(nibName: "collabCell", bundle: nil), forCellReuseIdentifier: cellReuseIdentifier)
                cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! collabCell!
            }


            return cell

}
Cevap 18/05/2018 saat 11:17
kaynak kullanıcı

oy
0

İşte hücreleri kayıt için evrensel bir yaklaşımdır UITableView:

protocol Reusable {
    static var reuseID: String { get }
}

extension Reusable {
    static var reuseID: String {
        return String(describing: self)
    }
}

extension UITableViewCell: Reusable { }

extension UITableView {

func register<T: UITableViewCell>(cellClass: T.Type = T.self) {
    let bundle = Bundle(for: cellClass.self)
    if bundle.path(forResource: cellClass.reuseID, ofType: "nib") != nil {
        let nib = UINib(nibName: cellClass.reuseID, bundle: bundle)
        register(nib, forCellReuseIdentifier: cellClass.reuseID)
    } else {
        register(cellClass.self, forCellReuseIdentifier: cellClass.reuseID)
    }
}

Açıklama:

  1. ReusableProtokol sınıf adı hücre kimliğini oluşturur. Eğer kuralına uyulur emin olun: cell ID == class name == nib name.
  2. UITableViewCelluygun Reusableprotokol.
  3. UITableView uzatma ucu veya sınıf yoluyla hücrelerin kayıt farkını ortadan kaldırır.

Kullanım örneği:

override func viewDidLoad() {
    super.viewDidLoad()
    let tableView = UITableView()
    let cellClasses: [UITableViewCell.Type] = [PostCell.self, ProfileCell.self, CommentCell.self]
    cellClasses.forEach(tableView.register)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: PostCell.self.reuseID) as? PostCell
    ...
    return cell
}
Cevap 18/08/2017 saat 08:08
kaynak kullanıcı

oy
0

Bu uzantı Xcode7 beta6 gerektirir

extension NSBundle {
    enum LoadViewError: ErrorType {
        case ExpectedXibToExistButGotNil
        case ExpectedXibToContainJustOneButGotDifferentNumberOfObjects
        case XibReturnedWrongType
    }

    func loadView<T>(name: String) throws -> T {
        let topLevelObjects: [AnyObject]! = loadNibNamed(name, owner: self, options: nil)
        if topLevelObjects == nil {
            throw LoadViewError.ExpectedXibToExistButGotNil
        }
        if topLevelObjects.count != 1 {
            throw LoadViewError.ExpectedXibToContainJustOneButGotDifferentNumberOfObjects
        }
        let firstObject: AnyObject! = topLevelObjects.first
        guard let result = firstObject as? T else {
            throw LoadViewError.XibReturnedWrongType
        }
        return result
    }
}

yalnızca 1 özel UITableViewCell içeren bir XIb'nin dosyası oluşturun.

Yükle.

let cell: BacteriaCell = try NSBundle.mainBundle().loadView("BacteriaCell")
Cevap 28/08/2015 saat 19:44
kaynak kullanıcı

oy
0
 NSString *CellIdentifier = [NSString stringWithFormat:@"cell %ld %ld",(long)indexPath.row,(long)indexPath.section];


    NewsFeedCell *cell = (NewsFeedCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell=nil;

    if (cell == nil)
    {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"NewsFeedCell" owner:nil options:nil];

        for(id currentObject in topLevelObjects)
        {
            if([currentObject isKindOfClass:[NewsFeedCell class]])
            {
                cell = (NewsFeedCell *)currentObject;
                break;
            }
        }
}
return cell;
Cevap 11/06/2014 saat 07:38
kaynak kullanıcı

oy
0

: İşte benim bunun için bir yöntemdir XIB Dosyalardan Özel UITableViewCells yükleniyor ... Yet Another Yöntem

Fikir bir SampleCell alt sınıfını yaratmaktır UITableViewCellbir ile IBOutlet UIView *contentmülkiyet ve koddan yapılandırmanız gerekir Subview her özel bir özellik. Sonra SampleCell.xib dosyası oluşturmak için. Bu ucu dosyasında SampleCell dosya sahibini değiştirmek. Bir içerik ekleyin UIViewihtiyaçlarınıza göre boyutlandırılır. Ekleyin ve bütün subviews (etiket, görüntü görünümleri, düğmeler, vb) istediğiniz yapılandırın. Son olarak, içerik görünümü ve dosya sahibine subviews bağlar.

Cevap 24/03/2011 saat 12:51
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more