4 Stimmen

Seltsames Problem mit UINib / Zeiger verschwindet

Ich habe etwas Seltsames bei der Verwendung von UINib, obwohl ich vermute, dass das eigentliche Problem woanders liegt.

Meine Anwendung verwendet einen Tableview, die Inhalte für die Zellen wurden aufgrund ihrer Komplexität im Interface Builder vorbereitet. Für neue Zellen (im Gegensatz zu wiederverwendeten) wird der Inhalt der Nib mit der Methode UINib-Klasse . Da nur eine Feder für alle Zellen verwendet wird und um den Overhead beim Laden der Datei jedes Mal zu reduzieren, habe ich eine UINib als Eigenschaft hinzugefügt cellNib zu meiner viewcontroller-Unterklasse, die ich einmal in meiner Implementierung von viewDidLoad lade.

Jetzt kommt der merkwürdige Teil. Alles funktioniert gut, die tableview ist mit seinen Daten gefüllt und alle Zellen sind mit dem Inhalt der Feder eingerichtet, wie sie sein sollten. Aber sobald ich die tableview blättern, stürzt die Anwendung.
Der Callstack hat dies verraten: -[NSCFNumber instantiateWithOwner:options:]: Nicht erkannter Selektor an Instanz gesendet Offensichtlich wurde die Nachricht, den Inhalt von cellNib erneut zu instanziieren, an das falsche Objekt gesendet. Das Objekt, an das die Nachricht gesendet wird, unterscheidet sich von Mal zu Mal, so dass etwas Zufälliges vor sich geht.

Ich verstehe es nicht - warum funktioniert es etwa 10 Mal beim Laden des Tableviews, aber nicht mehr, wenn der Tableview gescrollt wird?

Wenn ich eine neue Instanz von UINib erstelle jede Zeit (wie in meinem Code unten zu sehen), dann funktioniert alles einwandfrei, auch das Scrollen.

Wo mache ich einen Fehler? Geht der Zeiger meiner UINib-Eigenschaft verloren? Wenn ja, warum?

Hier ist der Code, den ich verwende (ich habe das ganze Datenladen und andere Dinge entfernt, um es leichter zu lesen):

@interface NTDPadViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {

   NSManagedObjectContext *managedObjectContext;
   NSMutableArray *ntdArray;
   IBOutlet UITableView *ntdTableView;
   UINib *cellNib;

}

@property(nonatomic,retain) NSManagedObjectContext *managedObjectContext;
@property(nonatomic,retain) NSMutableArray *ntdArray;
@property(nonatomic,retain) UITableView *ntdTableView;
@property(nonatomic,retain) UINib *cellNib;

@end

Die Umsetzung:

@implementation NTDPadViewController

@synthesize managedObjectContext;
@synthesize ntdArray;
@synthesize ntdTableView;
@synthesize cellNib;

-(void)viewDidLoad {

   [super viewDidLoad];
   cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];

}

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

   static NSString *CellIdentifier = @"Cell";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil) {
       cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

       [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
       [cell setBackgroundColor:[UIColor clearColor]];

       // These two should work equally well. But they don't... of course I'm using only one at a time ;)
       // THIS WORKS:
       UINib *test = [UINib nibWithNibName:@"NTDCell" bundle:nil];
       NSArray *nibArray = [test instantiateWithOwner:self options:nil];

       // THIS DOESN'T WORK:
       NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];

       [[cell contentView] addSubview:[nibArray objectAtIndex:0]];

   }

   return cell;
}

Vielen Dank!!!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X