2016-04-03 16 views
4

でセルをデキューすることができないのObjective-C「識別子のニュースでセルをデキューすることができない - 識別子のためのペン先やクラスを登録したり、ストーリーボードでプロトタイプセルを接続する必要があります」iOSの - 識別子

#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 

識別子は、次のようになります。

enter image description here

私はこれで何ができるのでしょうか?

左側のスライドメニューを追加しようとしていますが、メニューボタンを押すとクラッシュします。

+0

スタティックセルですか?もしそうでなければ、どうしてそんなにたくさんあるのですか?テキストと画像を除いて、それらのセルは同じように見えます。これは 'cellForRowAtIndexPath'で設定する必要があります。静的なセルであれば、それらをデキューしないでください。 – Paulw11

+0

@ Paulw11プロトタイプセル –

+0

あなたが提示している 'SideBarViewController'のインスタンスを作成したコードを表示できますか? – Paulw11

答えて

0

非常に似ているので、与えられた例のすべてのセルは同じ識別子を持つ必要があります。アイコン+テキストはあなたのセルの内容です。セル識別子は、セルの共通構造を記述する。したがって、すべてのセルに対して1つの識別子を作成し、- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドでアイコンとタイトルを設定する必要があります。

+0

はい、このチュートリアルでは別の識別子を与えなければならないと言いました –

+1

Itn特に良いチュートリアルのようです。彼らは静的なセルを使ったばかりか、テーブルビューを正しく使う方法を示しているはずです – Paulw11

+0

@ Paulw11は同意します。 –

2

あなたは実際には非常に近く、問題は多くの新しい開発者にとって不満の元です。 dequeueReusableCellには、互いに排他的な(競合する)APIが2つあり、間違ってそれらを混在させてしまっています。 iOs2.0で導入

1.

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


このメソッドはnilを返すことができます。このメソッドは、セルを作成するまではあなたの責任です。

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

このメソッドはゼロを返すことが可能であってはならないiOs6.0 導入。テーブル内の各インデックスパスにUITableViewCellクラスと識別子を登録する必要があります。次に、セルが自動的に作成されます。 (これはUICollectionViewの導入と一致し、その作業の仕方です)

解決策。 最初の方法(これは問題ありません)を使用していますが、2番目の方法を使用しています。

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

か... のtableViewを使用してセルクラス/プロトタイプと識別子のコンボを登録する(はい、あなたはすべてのインデックスに対して同じ設定を使用することができます。 はあなたcellForRow ...このようなものにする方法を変更します。 。)あなたのコードをそのまま残してください。

これは非常に一般的な間違いであり、非常にうまく説明されていないものです.iOs6以前から開発してきた人だけで、2番目のアプローチの導入により、ベスト。