2013-11-28 50 views
0

當按鈕按下加載下面發佈的類時出現錯誤。無法使用標識符標記出列單元格

該代碼應該加載滑出菜單。這是導致我的問題的線。我對iOS/obj-c完全陌生。我不確定爲什麼,但是這行代碼所在的方法是爲_menuItems數組中的每個條目遍歷?數組中的每個項目的NSLog輸出,但它運行另一次並引發此錯誤?這就是我認爲至少在發生的事情。如果有人能給我一些指點,我會很感激。除此之外,我的項目有兩個目標 - 我不知道爲什麼,我不知道如何,我不知道如何改變它。這可能是問題嗎?

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

控制檯打印輸出是這樣的:

013-11-28 12:11:31.902 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.908 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.911 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.917 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.921 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.924 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.929 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.931 DatabaseTest[57858:a0b] The code runs through here! 
2013-11-28 12:11:31.932 DatabaseTest[57858:a0b] *** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2903.23/UITableView.m:5261 
2013-11-28 12:11:31.936 DatabaseTest[57858:a0b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier tag - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

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

@interface SidebarViewController() 

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

@implementation SidebarViewController 

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

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor colorWithWhite:0.2f alpha:1.0f]; 
    self.tableView.backgroundColor = [UIColor colorWithWhite:0.2f alpha:1.0f]; 
    self.tableView.separatorColor = [UIColor colorWithWhite:0.15f alpha:0.2f]; 

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

} 

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender 
{ 
    // Set the title of navigation bar by using the menu items 
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController; 
    destViewController.title = [[_menuItems objectAtIndex:indexPath.row] capitalizedString]; 


    if ([segue isKindOfClass: [SWRevealViewControllerSegue class]]) { 
     SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue; 

     swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) { 

      UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController; 
      [navController setViewControllers: @[dvc] animated: NO ]; 
      [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES]; 
     }; 

    } 

} 
- (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 [self.menuItems count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *CellIdentifier = [self.menuItems objectAtIndex:indexPath.row]; 
    NSLog(@"The code runs through here!"); 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    return cell; 
} 

@end 

回答

1

您必須使用

static NSString *CellIdentifier = @"messageCell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

如果您的電池未註冊類或筆尖與小區ID不要使用;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier 
forIndexPath:indexPath]; 

蘋果文檔:

重要

必須使用registerNib註冊類或筆尖文件:forCellReuseIdentifier:或的registerClass:forCellReuseIdentifier:方法調用此方法之前。

編輯:

+0

它要麼/或:如果一個類或筆尖註冊,那麼你不必檢查cell!= nil。 –

+0

我正在使用的代碼是從它工作的例子中獲得的,所以我不知道爲什麼需要做出這麼大的改變。我在問題中提到我的項目有兩個目標,可能會以某種方式導致這個問題? – Killian

+0

一些解決方法:1.檢查您的NSString * CellIdentifier是否不爲零。使用UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 而不是UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; –

0

這是錯誤的:

NSString *CellIdentifier = [self.menuItems objectAtIndex:indexPath.row]; 

除非你已經註冊了一個小區,這是行不通的每一行。

您需要使用已在代碼或storyboard/xib中註冊的單元標識符。

此外,如果每個單元格都加載具有唯一標識符的單元格,則您現在正在執行此操作的方式不利於單元格的重用。

+0

當你說單元標識符是否指單元的屬性檢查器中的標識符?我在表中有8個原型單元格,每個單元格的名稱都對應於數組中的一個條目。 我有另一個例子,基於一個原型和一個數組上的條目填充表,但此刻我從使用此確切代碼的教程複製,並且我不知道爲什麼它不起作用 – Killian

+0

爲什麼不使用靜態tableview呢? – Abizern

+0

我對iOS來說是全新的,所以我只是試圖獲得一個例子來形成我使用的教程,它使用了這個確切的代碼。從我所瞭解到的情況來看,TableView只能在理論上擁有一個原型單元格,並且根據數組中元素的數量動態添加單元格。靜態tableview刪除這個我猜的動態部分? – Killian

0

我不確定你是否仍然在這個問題的答案後,但如果你在這裏是你可以解決你的問題的方式。

您的問題來自於單元格沒有標識符或者標識符與NSArray * menuItems中的代碼不匹配的事實。爲了解決這個問題:

  • 你應該去文檔大綱(在你的故事板左下方的小箭頭)
  • ,那麼你應該點擊「表格視圖單元格 - 標籤。 (應該強調的細胞「標籤」
  • 轉到屬性檢查器,然後找到「標識符」

  • 最後,改變或廣告標識符名稱,你的情況「標籤」。

  • 的Et瞧!那應該做的伎倆

當心拼寫目標C是拼寫很緊,我的意思是,你必須確保你拼寫的標識,你必須以同樣的方式在你的代碼中使用相同的拼寫。

希望有所幫助,

見圖片:(我想後一個給你,但似乎我不能這樣做,哎呀!)

相關問題