3

行を挿入および削除するUITableViewがあります。

10個の値の配列があり、すべての行を含むテーブルビューから始めると、テーブルは正常に表示されます。次に、[0、1、5]以外のすべてを除外したい場合。次に、インデックスパス[2、3、4、6、7、8、9]で行を削除するプロセスを実行し、返される行数は3です。セルレンダリングコードを変更する必要はありません。行を表示します:[0、1、5]。

ただし、すべてをフィルタリングした後、このテーブルに戻って、行[0、1、5]のテーブルを永続化からロードしたい場合は、問題が発生します。テーブルは行数:3でロードされ、セルをレンダリングします:[0、1、2]。

viewDidLoadで0行でテーブルを初期化してから、viewDidAppearでinsertRows:[0、1、5]を呼び出してみましたが、これにより例外がスローされます。

***-[UITableView _endCellAnimationsWithContext:]、/ SourceCache / UIKit_Sim / UIKit-2380.17 / UITableView.m:909でのアサーションの失敗

そして、viewDidLoadで、行数が0を出力し、このエラーがスローされる直前に、出力される行数が3であることを確認しました。

編集代わりに[0、1、2]を挿入すると、機能します...しかし再び...最終的には[0、1、5]が表示される必要があります。

-(void)viewDidAppear:(BOOL)アニメーション
 {{
    [super viewDidAppear:animated];

    NSArray * initialize_indeces = @ [[NSIndexPath indexPathForRow:0 inSection:0]、[NSIndexPath indexPathForRow:1 inSection:0]、[NSIndexPath indexPathForRow:5 inSection:0]];
    [self.userDataTable insertRowsAtIndexPaths:initializing_indeces withRowAnimation:UITableViewRowAnimationAutomatic];
}
-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{{
    //異なるブール値を使用しますが、要点は次のとおりです。
    if(viewDidLoad)
        0を返します。
    if(viewDidAppear ||フィルター処理済み)
        3を返します。
    if(拡張)
        10を返します。
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@ "CELL"];

    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault restartIdentifier:@ "CELL"];
    }


    [cell.textLabel setText:[NSString stringWithFormat:@ "%i"、indexPath.row]];

    セルを返します。
}
4

4 に答える 4

1

自分でマッピングを追跡する必要があります。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@ "CELL"];

    if(!cell){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault restartIdentifier:@ "CELL"];
    }


    int row = indexPath.row;
    if(フィルタリング){
        //0-0を変換します
        //翻訳1-1
        //翻訳2-5
    }

    [cell.textLabel setText:[NSString stringWithFormat:@ "%i"、row]];

    セルを返します。
}

最終的にNSMutableArrayを使用しました。これは、フィルター処理されると[0、1、5]になるため、その配列のインデックスにアクセスすると、indexPath.rowof2は5を返します。

于 2013-02-12T05:04:07.503 に答える
1

@Fish stix

[cell.textLabel setText:[NSString stringWithFormat:@ "%i"、indexPath.row]];

コード内のこのメソッドは、テキストがindexPath.rowの値を持つNSStringになることを明確に示しています。これで、行とデータソースを削除するときに、10 = [0, 1, 5] + [2, 3, 4, 6, 7, 8, 9]から3 = [0, 1, 5]。データソースはカウント3の配列に削減されました。したがって、返されるbbynumberOfRowsInSectionメソッドとしてのみ3行が取得されます。3つの行には、これらのindexPath.rowが含まれ0, 1, 2ます。したがって、0,1 ,2の代わりに取得しています0, 1 ,5

indexPathを出力すると、cellForRowAtIndexPathメソッド(フィルタリング後)で、セクション0を意味する[0、0] [0、1] [0、2]、および行番号0、1、2としてそれぞれ表示されます。したがって、あなたの結果

あなたの望む結果を得るためのように。これを行う。プロパティを取得@property(retain、nonAtomic)NSArray * dataArray;

in viewDidLoad:self.dataArray = [NSArray arrayWithObjects:@ "0"、@ "1"、@ "2"、@ "3"、@ "4"、@ "5"、@ "6"、@ "7" 、@ "8"、@ "9"、nil];

numberOfRowsInSectionで return[配列数];

およびcellForRow [cell.textLabelsetText:[self.dataArray objectAtIndex:indexPath.row]];

ここで、 viewWillAppearまたは任意の場所でdataSource(つまりdataArray)をフィルター処理または展開された状態に変更し、[self.tableViewreloadData]を使用してテーブルデータを再読み込みします。

私がはっきりしていることを願っています。乾杯、楽しんでください。

于 2013-02-12T05:25:56.783 に答える
0

まずはnumberOfRowsInSection返品しNSIntegerないintので、変更してください

私は正確にはResoneが何であるかを知りません。問題はコードのこの部分に関連している必要があると思いますが、

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

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

一般的に、これらのデータソースメソッドの1つで間違いを犯しています。正確に何が間違っているかを言うことは不可能かもしれませんが、それは次のようなものである可能性があります:あなたはテーブルビューをthenumberOfRowsInSectionあなたの場合は10)で 伝え、あなたはたとえば10-1thecellForRowAtIndexPath行しか処理しません。データソースの実装を見せていただければ、何が起こっているのかを簡単に知ることができます。

于 2013-02-12T04:36:18.603 に答える
0

挿入するたびに、を使用してテーブルビューをリロードする必要があります[tableView realodData]

于 2013-02-12T05:23:33.810 に答える