Hogyan betölteni az egyéni UITableViewCells származó XIb fájlokat?

szavazat
278

A kérdés egyszerű: Hogyan betölteni az egyéni UITableViewCellszármazó XIb fájlokat? Ezzel lehetővé teszi, hogy az Interface Builder tervezni a sejteket. A válasz nyilvánvalóan nem egyszerű, mivel a memória gazdálkodás kérdéseket. Ez az üzenet említi a kérdést, és azt javasolja a megoldás, de előre NDA-kibocsátás és hiányzik kódot. Itt egy hosszú fonál , amely kitér a anélkül, hogy végleges választ.

Itt van néhány kód, amit használnak:

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];
}

Ahhoz, hogy használni ezt a kódot, létrehozni MyCell.m / .h, egy új alosztálya UITableViewCell, és adjunk hozzá IBOutletsa kívánt összetevők. Ezután hozzon létre egy új, „Üres XIB” fájlt. Nyissa meg a XIb fájlt IB, adjunk hozzá egy UITableViewCelltárgy, beállíthatjuk a azonosítóval „MyCellIdentifier” beállítást, és a kategóriájában a MyCell és add meg a komponenseket. Végül csatlakoztassa az IBOutletsaz alkatrészeket. Vegyük észre, hogy nem határozta meg az fájl tulajdonosának IB.

Más módszerek híve beállításával fájl tulajdonosának és figyelmezteti a memóriavesztés, ha a XIb nincs betöltve egy kiegészítő gyár osztályban. Kipróbáltam a fenti okmányok alapján / szivárgásokat, és nem látott memóriavesztés.

Tehát mi a kanonikus módon betölteni sejtek Xibs? Ne elindultunk fájl tulajdonosának? Szükség van egy gyár? Ha igen, mi a kódja a gyári néz ki? Ha van több megoldás, tisztázzuk az előnye és hátránya, mindegyikük ...

A kérdést 12/02/2009 08:27
a forrás felhasználó
Más nyelveken...                            


23 válasz

szavazat
292

A helyes megoldás a következő:

- (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;
}
Válaszolt 29/11/2012 16:57
a forrás felhasználó

szavazat
282

Íme két módszer, amely az eredeti szerző államok javasolta egy IB mérnök .

Lásd az aktuális bejegyzést további részletekért. Inkább módszer # 2, mint amilyennek látszik egyszerűbb.

Módszer # 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;
}

Módszer # 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;
}

Frissítés (2014): Módszer # 2 továbbra is érvényes, de nincs dokumentáció többé. Régen a hivatalos dokumentáció , de már eltávolították javára készítőivel.

Írtam egy működő példa a GitHub:
https://github.com/bentford/NibTableCellExample

Válaszolt 21/12/2009 11:19
a forrás felhasználó

szavazat
33

Regisztráció

Miután iOS 7, ez a folyamat egyszerűbb le ( gyors 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")

( Megjegyzés ) Ez is megvalósítható azáltal, hogy a sejteket a .xibvagy .stroyboardfájlokat, prototípus sejteket. Ha kell csatolni egy osztályt őket, akkor jelöljük ki a cellát prototípus és adjuk hozzá a megfelelő osztályra (kell egy leszármazottja UITableViewCell, természetesen).

Dequeue

És később, dequeued használatával ( gyors 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
}

A különbség az, hogy ez az új módszer nemcsak dequeues a sejt, akkor is létrehoz, ha nem létező (ez azt jelenti, hogy nem kell tennie, if (cell == nil)mókák), és a sejt használatra kész, ahogy a fenti példában.

( Figyelem ) tableView.dequeueReusableCell(withIdentifier:for:)rendelkezik az új viselkedést, ha hívja a másikat (nem indexPath:), akkor a régi működéshez, amelyben meg kell, hogy ellenőrizze nil, és például magad, észre a UITableViewCell?visszatérési érték.

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

És persze, hogy milyen típusú, hogy a társított a cella az, amit meghatározott .xib fájlt a UITableViewCellalosztály, vagy más, a többi regiszter módszer.

Configuration

Ideális esetben a sejtek már beállított szempontjából megjelenését és tartalmát helymeghatározó (mint például a címkék és a kép megtekintés) mire nyilvántartásba vette, és a cellForRowAtIndexPathmódszer akkor egyszerűen töltse be őket.

Együtt

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
    }
}

És persze, ez mind rendelkezésre ObjC azonos nevű.

Válaszolt 21/05/2015 01:47
a forrás felhasználó

szavazat
32

Vette Shawn Craver válasza és tisztítani, hogy egy kicsit.

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

Azt, hogy az én UITableViewCell a alosztálya BBCell, majd cserélje ki a standard

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

val vel:

cell = (BBDetailCell *)[BBDetailCell cellFromNibNamed:@"BBDetailCell"];
Válaszolt 22/06/2010 03:15
a forrás felhasználó

szavazat
15

Régebben bentford féle módszer # 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;
}

Úgy működik, de vigyázz kapcsolatot fájl tulajdonosának az egyéni UITableViewCell .xib fájlt.

Átadásával owner:selfa loadNibNamednyilatkozatot, akkor állítsa a UITableViewControllermint fájl tulajdonosának a UITableViewCell.

Ha húzza a header fájlt IB létrehozott intézkedések és piacok, akkor állítsa be azokat a fájl tulajdonosának alapértelmezés szerint.

Az loadNibNamed:owner:optionsApple-kód megpróbálja beállítani ingatlan a UITableViewController, mivel ez a tulajdonos. De nem kell ezeket a tulajdonságokat az ott meghatározott, így kap hibaüzenetet arról, hogy legfontosabb érték kódoló-kompatibilis :

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

Ha egy esemény Kiválthatta ehelyett kapsz NSInvalidArgumentException:

-[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

Egy egyszerű megoldás az, hogy pont a Interface Builder csatlakozásokat UITableViewCellhelyett fájl tulajdonosának:

  1. Jobb klikk a fájl tulajdonosának, hogy húzza fel a kapcsolatok listája
  2. Vegyünk egy képernyőképet a Command-Shift-4 (húzással jelölje ki a területet kell befogni)
  3. x ki a kapcsolatok fájl tulajdonosának
  4. Jobb klikk a UITableCell az Objektum hierarchia, és újra hozzá a kapcsolatok.
Válaszolt 19/03/2012 22:41
a forrás felhasználó

szavazat
12

Úgy döntöttem, hogy tegye, mert én nem szeretem e válaszok bármelyikét - a dolgok mindig egyszerűbb, és ez messze a legnagyobb tömören, amit találtam.

1. Építsd XIb az Interface Builder, ahogy tetszik

  • Állítsa fájl tulajdonosának osztály NSObject
  • Add a UITableViewCell és állítsa osztály MyTableViewCellSubclass - ha IB összeomlik (történik Xcode> 4, mint az írás), csak használ egy UIView az nem a felület Xcode 4, ha még megvan fektetés körül
  • Elrendezés a subviews belül cellában és csatolja a IBOutlet kapcsolatot a @interface a .h vagy .m (.m az én preferencia)

2. Az Ön UIViewController vagy UITableViewController alosztály

@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;
}

3. Az Ön MyTableViewCellSubclass

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

    return self;
}
Válaszolt 26/08/2013 09:18
a forrás felhasználó

szavazat
8

Ha az Interface Builder, hogy a sejtek, ellenőrizze, hogy beállította az azonosító a felügyelő. Ezután ellenőrizze, hogy ez ugyanaz a hívás esetén dequeueReusableCellWithIdentifier.

Véletlenül elfelejtettem, hogy hozzanak néhány azonosítók egy asztali nehéz projekt, és a teljesítmény változás volt, mint éjjel-nappal.

Válaszolt 28/04/2010 11:55
a forrás felhasználó

szavazat
7

Loading UITableViewCells származó XIBs ment egy csomó kódot, de ez általában a szörnyű görgetés sebessége (valójában ez nem a XIB de a túlzott használata UIViews hogy okozhatja ezt).

Azt javaslom, hogy vessen egy pillantást a: link hivatkozás

Válaszolt 12/02/2009 15:19
a forrás felhasználó

szavazat
5

Itt az osztály módszer, hogy én már nem, amivel egyedi sejt közül XIBs:

+ (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;
}

Ezután a XIB, én meg az osztály nevét, és újrafelhasználás azonosító. Ezt követően, én is csak hívja ezt a módszert én nézetvezérlőben helyett

[[UITableViewCell] alloc] initWithFrame:]

Ez bőven elég gyors, és használják a kettő a hajózási alkalmazások. Ez sokkal megbízhatóbb, mint a hívó [nib objectAtIndex:0], és a fejemben legalább megbízhatóbbak, mint Stephan Burlot példáját, mert akkor garantált, hogy csak megragad egy nézet ki egy XIB hogy a megfelelő típusú.

Válaszolt 12/02/2009 14:47
a forrás felhasználó

szavazat
4

Helyes megoldás ezen

- (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; 
    }
Válaszolt 07/09/2016 08:33
a forrás felhasználó

szavazat
3

Jelölje be ezt az - http://eppz.eu/blog/custom-uitableview-cell/ - nagyon kényelmes módja egy apró osztályt, hogy végül egy sort vezérlő végrehajtása:

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

írja kép leírása itt

Válaszolt 09/07/2013 10:18
a forrás felhasználó

szavazat
3

Újratöltés az NIB drága. Jobb betölteni egyszer, két példányt a tárgyakat, amikor szükség van a cellában. Vegye figyelembe, hogy felveheti UIImageViews tartozik a tollhegy, még több cella, ezzel a módszerrel (Apple „registerNIB” iOS5 lehetővé egyetlen felső szintű objektum - Bug 10580062 „iOS5 Tableview registerNib: túlzottan korlátozó”

Tehát a kód alatt van - olvassa el a NIB egyszer (initialize, mint én, vagy viewDidload - bármit. Ettől kezdve a példányosítani a tollhegy objektumokra majd válasszon a amire szüksége van. Ez sokkal hatékonyabb, mint betölteni a tollhegy újra és újra.

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;
}
Válaszolt 14/12/2011 20:01
a forrás felhasználó

szavazat
2

Először importálja az egyéni sejt fájlt #import "CustomCell.h", majd módosítsa a delegált eljárás alább említett:

- (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;
}
Válaszolt 26/02/2014 07:48
a forrás felhasználó

szavazat
2

A helyes módja az, hogy hozzon létre egy UITableViewCell alosztály végrehajtását, fej- és XIB. A XIB távolítsa el véleményét és csak adj egy táblázat cellájában. Állítsa be az osztály nevét a UITableViewCell alosztály. Mert fájl tulajdonosa, hogy a UITableViewController alosztály osztály nevét. Csatlakoztassa a fájl tulajdonosa, hogy a cella segítségével a tableViewCell aljzatba.

A header file:

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

A végrehajtás file:

@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;
}
Válaszolt 28/06/2012 22:57
a forrás felhasználó

szavazat
2

Amit én csinálok, mert ez minősíti IBOutlet UITableViewCell *cella vezérlő osztályban. Majd indítsa el az NSBundle loadNibNamedosztály módszer, amely táplálja a UITableViewCella sejt fenti.

A XIb fogok létrehozni egy üres XIb és adjuk hozzá a UITableViewCelltárgy IB ahol be lehet állítani, ha szükséges. Ezt a nézetet, majd csatlakozik a cellát IBOutleta vezérlő osztályban.

- (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 kiegészítések loadNibNamed (ADC bejelentkezés)

cocoawithlove.com cikkben forrásból a koncepció (kap a telefonszámok Példaalkalmazás)

Válaszolt 12/02/2009 19:01
a forrás felhasználó

szavazat
1

A Swift 4.2 és Xcode 10

Van három XIB sejt fájlok

A ViewDidLoad regisztrálja XIB fájlokat, mint ez ...

Ez első megközelítésben

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")

Második megközelítés közvetlenül regisztrálni XIB fájlokat cellForRowAt indexPath:

Ez az én Tableview delegált funkciók

//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
    }

}
Válaszolt 12/10/2018 07:02
a forrás felhasználó

szavazat
1
  1. Hozza létre saját egyéni osztály AbcViewCellalosztálya re UITableViewCell(Győződjön meg róla, class fájl nevét és tollhegy fájlnév ugyanaz)

  2. Hozzon ez a kiterjesztés osztály módszer.

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

    let cell: AbcViewCell = UITableViewCell.fromNib()

Válaszolt 07/09/2017 04:07
a forrás felhasználó

szavazat
1

Nem tudom, ha van egy kanonikus módon, de itt a módszer:

  • Hozzon létre egy xib egy ViewController
  • Állítsa be a fájl tulajdonosa osztály UIViewController
  • Törlés a nézetet, és adjunk hozzá egy UITableViewCell
  • Állítsa be a Class a UITableViewCell az egyéni osztály
  • Állítsa be a Identifier a UITableViewCell
  • Állítsa a kimeneti a nézetvezérlőben céljából a UITableViewCell

És ezt a kódot:

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

Az Ön Például, használ

[nib objectAtIndex:0]

eltörhet, ha az Apple sorrendjét megváltoztatjuk elemeket a XIb.

Válaszolt 12/02/2009 10:03
a forrás felhasználó

szavazat
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

}
Válaszolt 18/05/2018 11:17
a forrás felhasználó

szavazat
0

Itt van egy univerzális megközelítés regisztráció sejtek 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)
    }
}

Magyarázat:

  1. Reusableprotokoll generál cellaazonosító- annak osztály nevét. Győződjön meg róla, hogy kövesse a konvenció: cell ID == class name == nib name.
  2. UITableViewCellmegfelel a Reusableprotokollt.
  3. UITableView kiterjesztése elvonatkoztat el a különbséget a regisztráció sejtekbe tollhegy vagy osztály.

Alkalmazási példa:

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
}
Válaszolt 18/08/2017 08:08
a forrás felhasználó

szavazat
0

Ez a kiterjesztés igényel Xcode7 beta6

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
    }
}

Hozzon létre egy fájlt, amely tartalmazza a XIb csak 1 egyéni UITableViewCell.

Tölteni.

let cell: BacteriaCell = try NSBundle.mainBundle().loadView("BacteriaCell")
Válaszolt 28/08/2015 19:44
a forrás felhasználó

szavazat
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;
Válaszolt 11/06/2014 07:38
a forrás felhasználó

szavazat
0

Itt van a módszer, hogy: betöltése Custom UITableViewCells származó XIB Files ... Még egy másik eljárás

Az ötlet az, hogy hozzon létre egy SampleCell alosztálya UITableViewCellegy IBOutlet UIView *contenttulajdon és a tulajdon az egyes egyéni subview konfigurálni kell a kódot. Ezután hozzon létre egy SampleCell.xib fájlt. Ebben a tollhegy fájlt, változtassa meg a fájl tulajdonos SampleCell. Add a tartalom UIViewméretű, hogy illeszkedjen az Ön igényeinek. Hozzá, és beállíthatja a subviews (címke képnézetekből, gombokat stb) akarsz. Végül össze a tartalmat látvány és a subviews a fájl tulajdonosa.

Válaszolt 24/03/2011 12:51
a forrás felhasználó

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