2016-04-03 6 views
4

‚nicht in der Lage eine Zelle mit der Kennung Nachrichten aus der Warteschlange entfernt - muss eine Spitze oder eine Klasse für die Kennung registrieren oder einen Prototyp Zelle in einem Storyboard verbinden‘iOS - Objective-C nicht in der Lage eine Zelle mit der Kennung aus der Warteschlange entfernt

#import "SidebarViewController.h" 
#import "SWRevealViewController.h" 



@interface SidebarViewController() 

@property (nonatomic, strong) NSArray *menuItems; 
@end 



@implementation SidebarViewController 


    NSArray *menuItems; 



- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     //custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    menuItems = @[@"title", @"news ", @"comments", @"map", @"calendar", @"wishlist", @"bookmark", @"tag"]; 


} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return menuItems.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *CellIdentifier = [menuItems objectAtIndex:indexPath.row]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    return cell; 
} 

@end 

Identifier wie folgt aussieht:

enter image description here

was kann ich damit machen?

Ich versuche, links Slide-Menü hinzufügen, aber es stürzt ab, wenn ich die Menütaste drücken.

+0

Sind sie statische Zellen? Wenn nicht, warum haben Sie so viele, diese Zellen sehen alle gleich aus mit Ausnahme von Text und Bild, die in 'cellForRowAtIndexPath' gesetzt werden sollten. Wenn sie statische Zellen sind, entziehen Sie sie nicht, sie sind nur da. – Paulw11

+0

@ Paulw11 sie sind Prototyp-Zellen –

+0

Können Sie den Code zeigen, wo Sie die Instanz von SideBarViewController erstellt haben, die Sie präsentieren? – Paulw11

Antwort

0

Alle Ihre Zellen im angegebenen Beispiel sollten denselben Bezeichner haben, da sie sich sehr ähnlich sind. Symbol + Text ist der Inhalt Ihrer Zelle. Zellidentifikator beschreibt die gemeinsame Zellstruktur. Sie müssen also einen Bezeichner für alle Ihre Zellen erstellen und das Symbol und den Titel in der Methode - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath festlegen.

+0

ja, aber in diesem Tutorial sagte, dass ich ihnen verschiedene Bezeichner geben muss –

+1

It doesn Es scheint kein besonders gutes Tutorial zu sein. Sie könnten einfach statische Zellen verwendet haben, oder sie hätten gezeigt, wie man Tabellenansichten korrekt verwendet. – Paulw11

+0

@ Paulw11 stimme zu. –

2

Sie sind eigentlich sehr nah, und Ihr Problem ist eine Quelle der Frustration für viele neue Entwickler. Es gibt zwei verschiedene, sich gegenseitig ausschließende (konkurrierende?) APIs für die Auslagerung von Wiederverwendbaren Zellen, und Sie haben sie versehentlich gemischt.

1.

- (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier 

in iOs2.0 eingeführt.
Diese Methode ist in der Lage, null zurückzugeben. Wenn dies der Fall ist, liegt es an Ihnen, die Zelle zu erstellen.

2.

- (__kindofUITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath 

eingeführt iOs6.0 Diese Methode sollte nicht in der Lage sein, gleich Null zurückzukehren. Dazu müssen Sie eine UITableViewCell-Klasse und einen Bezeichner für jeden Indexpfad in der Tabelle registrieren. Anschließend werden die Zellen automatisch für Sie erstellt. (Dies fiel mit der Einführung von UICollectionView und es ist, wie diese arbeiten)

Lösung. Sie verwenden die erste Methode (das ist in Ordnung), aber Sie haben die Methode von der zweiten verwendet. ändern Sie Ihre cellForRow ... Methode, um so etwas wie dieses:

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

    NSString *CellIdentifier = @"someStaticString" ; 
    //btw, it is poor practice to name variables with a capital. Save that for classes/types 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 

     cell = [[MYcellClass alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier: CellIdentifier]; 
    } 
    //configure cell 
    return cell; 
} 

oder ... registrieren Ihre Zellklasse/Prototyp und Kennung Combo mit dem Tableview (ja, Sie die gleiche Einstellung für alle Indizes verwenden können. .) und dann den Code so lassen, wie er ist.

IMHO das ist ein sehr verbreiteter Fehler und etwas, das nicht schrecklich gut dokumentiert ist, nur Jungs, die sich seit vor iOs6 und der Einführung des zweiten Ansatzes entwickelt haben, sehen den Unterschied ohne Hilfe. Beste.

Verwandte Themen