2012-03-07 7 views
10

私のアプリのテーブルにはUITableViewControllerを使用しています。NSFetchedResultsControllerを追加しました(デリゲートとしてselfを設定してください)。NSFetchedResultsControllerによって管理されているUITableViewに余分な行を追加します

しかし、NSFetchedResultsControllerの述語によって生成される項目とは無関係に、テーブルの最後のセルとしてユニークなセルを追加したいと思います。このセルを常にテーブルの最下部にします。私は、単にテーブルビュー・データ・ソースに、これらの方法に1を追加しようとした

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 
- (NSUInteger)tableView:(UITableView *)sender numberOfRowsInSection:(NSUInteger)section 
{ 
    return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects] + 1; 
} 

そして(テーブルのみ1部を有している)、この余分な行がそうように生成されている場合をキャッチを:

- (UITableViewCell *)tableView:(UITableView *)sender 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == [self.fetchedResultsController.fetchedObjects count]) { 
     //Generate the last cell in table. 
    } else { 
     //Generate the rest of the cells like normal. 
    } 
    return nil; //To keep the compiler happy. 
} 

インデックスが最後のセルであるかどうかをチェックし、適切に処理します。

私はまだ、実行時に次のエラーを取得していますが:

*** Terminating app due to uncaught exception 'NSRangeException', 
reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

これを引き起こしているものの任意のアイデア?または、NSFetchedResultsControllerによって制御されるテーブルビューに余分な行を追加するより良い方法はありますか?

答えて

13

ドキュメントに示されているようにすべてのデータソースメソッド(更新など)を実装すると、フェッチされた結果コントローラがかなり密接にテーブルビューに結びついています。それはかなり厄介でハッキーになるでしょう。

あなたの「余分な行」は、代わ​​りに表のフッタービューですか?これは常に底になります。とにかく他の細胞と違って見えるようにするには、見た目からは細胞のように見えるようにすることはそれほど多くの作業ではありません。テーブルを考えると

+0

ああ、これは実際にはこれを実装するもっと良い方法です。ありがとうございます。 (明らかに、私はまだiOSプログラミングの新機能です:-)) –

+0

はい、それは非常にハッキーです。このアイデアは偉大なほど簡単です...どうもありがとう! – Shingoo

+0

しかし、このように見える - http://stackoverflow.com/questions/10965098/nsfetchedresultscontroller-prepend-a-row-or-section –

2

にのみ、このコードは間違って見える、一つのセクションがあります。

- (NSUInteger)numberOfSectionsInTableView:(UITableView *)sender 
{ 
    return [[self.fetchedResultsController sections] count] + 1; 
} 

私はテーブルビューが第二のセクションを取得しようとすると、あなたのクラッシュが発生した疑いがあります。 + 1は削除する必要があります。

フェッチされた結果コントローラー(NSFetchedResultsController prepend a row or sectionを参照)から供給されたテーブルを使用すると、より複雑な作業を行うことができるため、この単純なケースを使用することができます。

+0

まだtableView:cellForRowAtIndexPath:は[[self.fetchedResultsController sections] count]回呼ばれます。 –

0

UITableViewのヘッダーとフッタービューに組み込まれているものを使ってみませんか?

例:

UIView *customBottomView = [UIView alloc] init... //set up your View (what you called custom bottom cell

self.table.tableFooterView = customBottomView。 //代わりにtableHeaderView

技術的には、テーブルに追加されたテーブルの下(または上)に表示されるビューを追加しています。ユーザーには、これが(最後の)セルであるか単にビューであるかを判断する方法はありません。 didSelectRowAtIndexPathのようなメソッドを使用することを計画していたならば、回避するだけです。

関連する問題