2012-03-21 10 views
5

私はストーリーボードファイルで識別子 "mainViewTableCell"を持つプロトタイプセルを作成し、メインテーブルビューを "NTTableViewController"という名前のカスタムコントローラクラスに接続しました。 次のように私はNTTableViewController.mで機能「のtableView cellForRowAtIndexPath」を実装しました:dequeueReusableCellWithIdentifierからnilを取得し続けますか?


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* MAINVIEW_CELLIDENTIFIER = @"mainViewTableCell"; 
    UITableViewCell *newCell = [tableView dequeueReusableCellWithIdentifier: MAINVIEW_CELLIDENTIFIER]; 

    if (newCell == nil) { 
     newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; 
     [newCell autorelease]; 
     newCell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    NTContactItem* currentItem = [self.contactItemContainer objectInContainerAtIndex: indexPath.row]; 
    NSString* firstName = currentItem.firstName; 
    NSString* lastName = currentItem.lastName; 

    NSString* fullName = [firstName stringByAppendingFormat: lastName];  
    [newCell.textLabel setText: fullName]; 
    [newCell.detailTextLabel setText: currentItem.mobilePhone]; 

    return newCell; 
} 

しかし、私はdequeueReusableCellWithIdentifierからnilを取得維持し、セルの新しいインスタンスを毎回作成する必要があります。

次に、何が間違っていますか?

コード:project

は、事前にすべてのいただきありがとうございます。

+0

はあなたが、まさにこの同じ文字列に、このプロトタイプセルの識別子を設定してください。ストーリーボードに? –

+0

@FirozeLafeer私は確信しています。実際に私は問題を発見したときにそれを最初にチェックしました。 –

答えて

26

プロトタイプセルを持つストーリーボードとテーブルビューでは、[tableView dequeueReusableCellWithIdentifier:]はnilを返してはなりません。これが最初のセルであり、再利用キューにすでにセルがない場合でも、テーブルビューはプロトタイプセルの新しいインスタンスを作成し、それを返します。

あなたのケースでは、問題はまったく違うものでした(私は本当に興味があったのでプロジェクトをダウンロードしました)。

application:didFinishLaunchingWithOptions:メソッドのアプリケーションのデリゲートで、このtableviewcontrollerを再初期化しています。 [masterController init]に電話すると[super init]が呼び出され、[UITableViewController initWithStyle:]が呼び出されます。

これにより、コントローラがストーリーボードのものとは異なる新しいUITableViewを作成します。新しいUITableViewにはプロトタイプのセルがないため、dequeueReusableCellWithIdentifier:がnilを返すのはこのためです。

もちろん、既に初期化されているObjective-Cオブジェクトを再初期化しないことが賢明です。テーブルビューコントローラがストーリーボードから読み込まれると、読み込みメカニズムはinitWithCoder:で初期化します。だから、カスタム初期化作業(あなたのケースでNSMutableArrayを設定する場合など)を行う必要がある場合は、initWithCoder:および/またはawakeFromNibをオーバーライドしてください。

これらのメソッドは、自分で呼び出すことはできません。を呼び出すことはできません。 initWithCoder:awakeFromNibの両方がStoryboard/nibローディングメカニズムによって呼び出されます。

すべてが正しい場合は、ここでプログラムでセルを作成する必要はありません。このコードは必要ありません。

// This bit is unnecessary with storyboards:  
if (newCell == nil) { 
    newCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: MAINVIEW_CELLIDENTIFIER]; 
    [newCell autorelease]; 
    newCell.selectionStyle = UITableViewCellSelectionStyleNone; 
} 

希望するものがあります。

+0

今はすべてうまく動作します。 [masterController init]を呼び出す理由は、masterControllerのinitがまったく呼び出されず、NSMutableArrayプロパティが初期化されていないことが分かりました。私はinitWithCoderがinitと同じことをすることができないことを知りませんでした。それは、ストーリーボードの読み込み中に自動的に呼び出されます。そして、私はstoryboard/nibファイルの読み込みメカニズムについてもっと知る必要があります。ありがとうございました! –

+0

これは一日中狂ってしまった。私は、ここで示されているように、tableViewを再作成していた宛先(source stgue)からカスタムのinit(古いソースをストーリーボードの前の古いソース)を呼び出していました。 prepareForSegueメソッドを使用して値を渡すと、すべてのreuseIdentifierが正しく機能しました。フィローズありがとう! –

+0

私は同じ問題を抱えていて、ストーリーボードのinstatiateViewControllerWithIdentifierを使ってtableviewcontrollerをインスタンス化しました。今はすべて正常に動作します。 – Claus

1

表のセルは、非表示になったときにのみ再利用可能になります。そのため、現在表示しているセルの数をメモリに保存してください。いくつのセルを表示していて、どれだけ多くのセルが割り当てられていますか?

+0

私はXcodeが提供する "マスター詳細アプリケーション"テンプレートを使用して新しいプロジェクトを作成しました。 dequeueReusableCellWithIdentifier関数は、最初のセルが最初に作成されたときに何も返さなかったが、nilを返す。なぜそうなのか? –

2

@フィローズの答えを読んだあと、私は数日間私を傷つけていた問題を解決し、別の解決策を見つけました。私は質問がすでに答えられていることを知っているが、これは誰かを助けるかもしれない。

私のケースでは、私はいくつかのリファクタリング(新しいTableViewControllerを抽出した)を行いました。その後、dequeueReusableCellWithIdentifierから返されたnilセルを取得していました。

私の修正ではなくdidSelectRowAtIndexPathに私のViewControllerにalloc/initを呼び出すのでは、これを行うことでした。

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" 
               bundle:nil]; 

MyTableViewController* controller = [sb instantiateViewControllerWithIdentifier: 
            @"MyTableViewController"]; 

(その後、私は[self.navigationController pushViewController:controller animated:YES];を呼ぶ - おそらくクリーンな方法ではないが、それは動作します)

1

だけで私の場合は、TableView(Storyboard)のコンテンツを "Static cells"から "Dynamic Prototypes"に変更するのを忘れてしまいました。

0

典型的な原因:

[tableView dequeueReusableCellWithIdentifier: @"id"];のXcodeと一致していません>属性インスペクタ>テーブルビューセル>識別子> ID

関連する問題