8

私は iOS 開発にまったく慣れていないので、簡単なはずのことを試すのに苦労しています。ユーザーが既存の行のいずれかをクリックするたびに、TableView に余分な行を追加します。そのアクションには本当の目的はありません。TableView の動作を理解したいだけです。

だから私は次のことをしました:

Split View ベースのテンプレートを使用し、RootViewController で行数を 30 に変更しました。

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
   // Return the number of rows in the section.
   return 30;
}

メソッド tableView:didSelectRowAtIndexPath は次のようになります。

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    /*
    When a row is selected, set the detail view controller's detail item to the item associated with the selected row.
    */
   NSMutableArray* paths = [[NSMutableArray alloc] init];
   NSIndexPath *indice = [NSIndexPath indexPathForRow:30 inSection:0];
   [paths addObject:indice];
   detailViewController.detailItem = [NSString stringWithFormat:@"Second Story Element %d with all its information and bla bla bla", indexPath.row];
   [[self tableView] beginUpdates];
   [self.tableView insertRowsAtIndexPaths:(NSArray *) paths withRowAnimation:UITableViewRowAnimationNone];
   [[self tableView] endUpdates];
}

プログラムを実行して要素の 1 つをクリックすると、次のエラーが表示されます。

*** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: '無効な更新: セクション 0 の行数が無効です。更新後の既存のセクションに含まれる行数 (30) は、行数と等しくなければなりません更新前にそのセクションに含まれていた (30)、そのセクションから挿入または削除された行数 (1 挿入、0 削除) をプラスまたはマイナスします。

テンプレートが提供するコードの他の部分は変更していません。

Apple のドキュメントと次の質問への回答をかなり広範囲に読んで ます

2 番目の質問は同じ問題に対処しているようですが、何が起こっているのか理解できません。dataSource とはどういう意味ですか? 私がよく理解している応答は、次のように述べています。

これは 2 段階のプロセスです。最初にデータ ソースを更新して、numberOfRowsInSection と cellForRowAtIndexPath が挿入後のデータに対して正しい値を返すようにします。行を挿入または削除する前にこれを行う必要があります。そうしないと、「行の数が無効です」というエラーが表示されます。

このデータ ソースの更新は何を意味しますか?

私は完全にイライラしているので、サンプルコードは非常に高く評価されます.

ところで、私がしようとしているのは、編集モードに入ることとは何の関係もありませんね。

4

4 に答える 4

14

tableView:numberOfRowsInSection:によって返されるカウントを同期しておく必要があります。

したがって、30行ある場合、テーブルビューに新しい行を挿入するように指示すると、tableView:numberOfRowsInSection:31が返されることを確認する必要があります.

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section
{
   return self.rowCount;
}

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   self.rowCount++;

   [self.tableView beginUpdates];
   [self.tableView insertRowsAtIndexPaths:(NSArray *) paths withRowAnimation:UITableViewRowAnimationNone];
   [self.tableView endUpdates];
}

実際には、おそらく配列を使用して行return [self.rows count];などを追跡します

于 2012-05-31T17:12:15.317 に答える
3

答えは非常に簡単です。テーブル ビューを変更する場合は、次の 2 つの簡単な手順を実行する必要があります。

  1. モデルを扱う
  2. テーブル アニメーションの処理

すでに 2 番目のステップを実行しています。しかし、あなたは最初のものを逃しました。通常、テーブルを扱うときは、データ ソースを渡します。つまり、その中に表示するデータです。

簡単な例では、NSMutableArrayダミー データを含む (名前が示すように動的です) を使用しています。

たとえば、.h に次のようなプロパティを作成します。

@property (nonatomic, strong) NSMutableArray* myDataSource;

.m で次のように合成します。

@synthesize myDataSource;

これで、その配列を次のように設定できalloc-initます (たとえば、viewDidLoadコントローラーのメソッド内)。

self.myDataSource = [[NSMutableArray alloc] init];
[self.myDataSource addObject:@"First"];
[self.myDataSource addObject:@"Second"];

次に、表示する行数 (この場合は 30) をハードコーディングする代わりに、次の操作を実行できます。

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section    {

   return [self.myDataSource count];
}

これで、didSelectRowAtIndexPathデリゲートに 3 番目の要素を追加できます。

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   [self.myDataSource addObject:@"Third"];

   [[self tableView] beginUpdates];
   [self.tableView insertRowsAtIndexPaths:(NSArray *) paths withRowAnimation:UITableViewRowAnimationNone];
   [[self tableView] endUpdates];
}
于 2012-05-31T17:26:51.670 に答える
2

1 つの大きな問題のようtableView:numberOfRowsInSection:です。そのメソッドで正しい行数を返す必要があります。

これを行うには、通常、テーブル ビューのアイテムのNSArrayorを維持するのが最善です。NSMutableArrayそのため、その関数では次のように言えますreturn [arrayOfValues count];。すべてのメソッドで簡単にアクセスできるように、配列をビュー コントローラー クラスのプロパティとして保持します。

配列は で使用することもできますcellForRowAtIndexPath:。の配列がある場合はNSString、 と言えcell.text = [arrayOfValues objectAtRow:indexPath.row];ます。

次に、アイテムをテーブルビューに追加したい場合は、それを配列に追加してテーブルをリロードするだけ[tableView reloadData];です.

このコンセプトを実装してみて、どうなるか教えてください。

于 2012-05-31T17:12:28.067 に答える
0

dayanamic テーブルセルに対してもそれを行うことができます

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {
            return [arrayStationStore count];
        }
        -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            static NSString *cellIndentyfire;
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentyfire];
            if (cell ==  nil)
            {
                cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIndentyfire];


            }



            cell.textLabel.text = [arrayStationStore objectAtIndex:indexPath.row];
            return cell;
        }

-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Check if current row is selected
    BOOL isSelected = NO;
    if([tblStationName cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark)
    {
        isSelected = YES;
    }

    if(isSelected)
    {
        [tblStationName cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
        [arrayReplace removeObject:indexPath];
        NSLog(@"array replace remove is %@ ",arrayReplace);
    }
    else
    {
        [tblStationName cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
        [arrayReplace addObject:indexPath];
         NSLog(@"array replace add is %@ ",arrayReplace);
    }
    return indexPath;
}
于 2014-10-07T15:05:11.843 に答える