2011-12-08 9 views
0

私は、あなたがセルの詳細を見ることができ、テーブルビューに新しいデータを追加することができる、テーブルビューの初期ビューコントローラで楽しいアプリケーションを構築しています。デリゲートを使用してtableviewにデータを追加するにはどうすればよいですか?

まず、プロジェクトがありますので、ロードして見てください。 http://dawtano.com/xc-project.zip

それは複雑なプロジェクトのビットだと私はコードの多くが廃止されていると思いますが、最初のアプリが働いているので、私はまだそれをクリーンアップする必要はありません。

アプリは、ストーリーボードを中心に構築および構成されている:

  • のDataModel(初期NSMutableArrayのを含む)
  • のViewController(メインビュー)
  • EditGrade(テーブルビューにデータを追加)
  • グレード(使用する文字列の定義)
  • GradeDetail(セルの詳細を表示)

EditGradeには、キャンセルボタンと完了ボタンに機能を追加するデリゲートも含まれています。

テーブルビューに新しいデータを追加しようとするときを除いて、すべてが正常に動作します(GradeDetailの[編集]ボタンを除く)。プロジェクトは問題なしで構築されます。 これは私が取得エラーメッセージであり、私は問題が何であるかを把握することができていない:

2011-12-08 12:56:54.643 ArrayTableView[30711:f803] *** Assertion failure in -  
[_UITableViewUpdateSupport _computeRowUpdates], /SourceCache/UIKit_Sim/UIKit-  
1912.3/UITableViewSupport.m:386 
2011-12-08 12:56:54.645 ArrayTableView[30711:f803] *** 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Invalid table view update. The application has requested an update to 
the table view that is inconsistent with the state provided by the data source.' 

私は現在見つめてる、あなたのいくつかは、問題が何であるかを決定することができることを願っています私はそれに目が見えません。

更新
@ T.Jに感謝します。私はこのプロジェクトで間違いを見つけました。問題は現在正しく実装されているため、addGradeが動作します。

フィールド@ T.Jにこのコードを追加しました。指摘:

- (void)tableView:(UITableView *)tableView commitEditingStyle: 
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
if (editingStyle == UITableViewCellEditingStyleDelete) { 
// Delete the row from the data source 
[self.dataModel removeGradeAtIndex:indexPath.row]; 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 
else if (editingStyle == UITableViewCellEditingStyleInsert) { 
// Create a new instance of the appropriate class, insert it into the array, 
and add a new row to the table view 
[self.dataModel addGrade:(Grade*)grades]; 
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
} 
} 

私は正しいコーディングを使用していますか?私は感覚がある

[self.dataModel addGrade:(Grade*)grades]; 

が間違っています。 DataModelは、使用しているので:

- (void)addGrade:(Grade*)grade 
{ 
[self.grades addObject:grade]; 
} 

答えて

1

@Matiasをあなたは、このコードセクションに必要なテーブルに行を挿入しようとしている場合:

else if (editingStyle == UITableViewCellEditingStyleInsert) { 
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
[self.dataModel addGrade ... 
[tableView insertRowAtIndexPaths ... 

コードを使用すると、その上に書いたコードのようになります。テーブルの行を削除する:

if (editingStyle == UITableViewCellEditingStyleDelete) { 
// Delete the row from the data source 
[self.dataModel removeGradeAtIndex:indexPath.row]; 

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 
+0

ああ、私は間違いを見つけられませんでした。それはまだ動作しませんが、私は間違いがどこにあったか知っています:私は現状を反映するために私の質問を更新しました。 –

+1

まだいくつか問題があります。addGradeは次のようになります。addGrade:(NSString *)faq multilig:(NSString *)multilig { // \t grade.gradeId = nextId ++; グレード*グレード= [[Grade alloc] init]; grade.fag = faq; grade.mundtlig = multilig; \t [self.grades addObject:グレード]; } –

+0

私は、なぜaddGradeメソッドを変更し、2つのnsstringを含む必要があるのか​​分かりません。必要なのは、1つ以上の文字列をnsmutablearrayグレードに追加することだけです。 –

関連する問題