2014-05-07 106 views
16

我試圖顯示一個用戶庫中的歌曲列表的TableView。我使用了this tutoria l的代碼(它使用了一個故事板,但我想嘗試一種不同的方式,並且只使用UITableView的一個子類)。無法將標識符單元格出列 - 必須爲標識符註冊一個筆尖或類,或連接故事板中的原型單元格?

我得到的錯誤:

*** Assertion failure in -[UITableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit/UIKit-2903.23/UITableView.m:5261 
2014-05-07 20:28:55.722 Music App[9629:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

和錯誤Thread 1: SIGABRT就行了:

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

這是我的代碼:

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    MPMediaQuery *songsQuery = [MPMediaQuery songsQuery]; 
    NSArray *songs = [songsQuery items]; 

    return [songs count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 

    // Configure the cell... 

    MPMediaQuery *songsQuery = [MPMediaQuery songsQuery]; 
    NSArray *songs = [songsQuery items]; 

    MPMediaItem *rowItem = [songs objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [rowItem valueForProperty:MPMediaItemPropertyTitle]; 
    cell.detailTextLabel.text = [rowItem valueForProperty:MPMediaItemPropertyArtist]; 

    cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-background.png"]]; 
    cell.textLabel.textColor = [UIColor colorWithRed:0.278 green:0.278 blue:0.278 alpha:1.0]; 

    cell.selectedBackgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Table-view-selected-background.png"]]; 

    cell.textLabel.backgroundColor = [UIColor clearColor]; 
    cell.detailTextLabel.backgroundColor = [UIColor clearColor]; 

    return cell; 
} 

應用程序加載和正常工作,當我在Mac上的iPhone模擬器中運行它時顯示一張空白表。它會在我的iPhone上運行時出現此錯誤。

任何幫助將不勝感激,謝謝!

+1

如果您已將故事板中的單元格的標識符設置爲「單元格」,這應該可以工作。你有嗎? – rdelmar

+0

我不使用故事板。我去了文件>新建文件> Objective-C類>創建songsTableViewController作爲UITableViewController的子類 – user3127576

+0

可能重複[斷言失敗dequeueReusableCellWithIdentifier:forIndexPath:](http://stackoverflow.com/questions/12737860/assertion-failure- in-dequeuereusablecellwithidentifierforindexpath) –

回答

18

如果您使用的是你已經註冊的筆尖爲表視圖中使用的電池你的檢查的自定義類,如下:

[self.yourTableViewName registerNib:[UINib nibWithNibName:@"YourNibName" bundle:nil] 
     forCellWithReuseIdentifier:@"YourIdentifierForCell"]; 

除此之外,請檢查您的自定義UITableViewCell子類是否具有適用的重用標識符。

如果你不使用自定義類,請按照蘋果文檔此說明:

的數據源,在其實施的tableView的:的cellForRowAtIndexPath:方法,返回一個配置的小區對象表格視圖可以用來繪製一行。出於性能原因,數據源儘可能地嘗試重用單元。它首先通過發送一個dequeueReusableCellWithIdentifier詢問具體可重複使用的單元格對象表視圖:

有關完整信息,請訪問以下鏈接:Creating a Table View Programmatically

我希望這有助於!

+0

如果您正在使用故事板,則無需執行此操作。 – SpaceDog

30

如果以編程方式創建表視圖,並且只使用默認的UITableViewCell,那麼您應該註冊該類(在viewDidLoad中是個好地方)。您也可以爲自定義類執行此操作,但只能在代碼中創建單元格(及其子視圖)(使用registerNib:forCellWithReuseIdentifier:如果單元格是在xib文件中創建的)。

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"]; 

然而,這樣只會讓你沒有detailTextLabel一個「基本」表格視圖單元格。要獲得這種類型的單元格,應該使用較短的dequeue方法dequeueReusableCellWithIdentifier :,如果它沒有找到具有該標識符的單元格,則不會引發異常,然後將if(cell == nil)子句用於創建單元格,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
    } 
    //Configure cell 
    return cell; 
} 
+0

我看到..謝謝你提到xib的東西:+1: – anztrax

8

的原因崩潰的是,你正在使用

[tableView dequeueReusableCellWithIdentifier: forIndexPath:] 

,這將導致崩潰,除非你指定單元格或筆尖文件被用於小區。

爲了避免撞車,使用下面的代碼行,而不是

[tableView dequeueReusableCellWithIdentifier:]; 

這行代碼將返回nil,如果沒有可使用的電池。

你可以看到文檔中的差異,可以找到here

還有一個很好的回答問答&一個,可以發現here

+0

非常感謝你。我沒有注意到這兩種方法之間的區別。 –

+0

錯!如果你這樣做,你會得到這個錯誤:「UITableView dataSource必須從tableView:cellForRowAtIndexPath返回一個單元格:」 – user3687

2

如果使用默認的UITableViewCell(不定製一個)[的tableView dequeueReusableCellWithIdentifier:forIndexPath:],你必須的RegisterClass或registerNib; (dequeReusableCellIdentifier:forIndexPath不會回到零細胞,如果細胞不存在,那麼它會automately創建一個新的tableViewCell使用默認UITableViewCellStyelDefault!)

否則,您可以使用[的tableView dequeueReusableCellWithIdentifier]沒有的registerClass或registerNib

0

我知道這有點晚,回答這個問題,但這是我失蹤。

我做:

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 

但我應該這樣做:

let cell = self.tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) 

注意:self.下一個加入的tableView。 我希望這可以節省24小時。

0

如果您使用StoryBoard,然後選擇該tableviewcontroller-> table->單元格,在屬性檢查器中給該單元格一個'標識符'。 確保您在'cellforrowatindexpath'方法中使用相同的'標識符'。

相關問題