0

さまざまなビューにデータを表示するために使用されるシングルトン クラスがあります。

行の削除/挿入に使用される TableView が 1 つあります。編集を許可するために編集/完了の間で変化するボタンがあります。「streams は Singleton クラス内の変数です」

- (void)setEditing:(BOOL)flag animated:(BOOL)animated{   

       int count = [streams count];


    UITableView *tableView = (UITableView *)self.view;
    NSArray *topIndexPath = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:count inSection:0]];

 if (self.editing == YES)
 {NSLog(@"EDITING");
 [tableView insertRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom];}

 else{NSLog(@"NOT EDITING");
 [tableView deleteRowsAtIndexPaths:topIndexPath withRowAnimation:UITableViewRowAnimationBottom];}


}

そして、editingStyleForRowAtIndexPath を使用して、各行に使用する編集スタイルを選択できるようにします。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

      int count = [streams count];
         int row = indexPath.row ;

 if (row == count)

       return    UITableViewCellEditingStyleInsert;

   else

       return UITableViewCellEditingStyleDelete;}

編集モードのときに、 cellForRowAtIndexPath を使用して、「電話番号を追加」というテキストを含む追加の行を作成します。

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

static NSString *DeleteMeCellIdentifier = @"AudioCellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
                         DeleteMeCellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                   reuseIdentifier:DeleteMeCellIdentifier] autorelease];
}
int x = indexPath.row;
if (self.editing == YES)
{
    if (indexPath.row == [streams count])

        cell.textLabel.text = @"Add Phone Number";

    else
        cell.textLabel.text = [self.streams objectAtIndex:indexPath.row];
}
else
{
    cell.textLabel.text = [self.streams objectAtIndex:indexPath.row];
}

return cell;}

行の削除は正常に機能します。行の挿入を選択すると、別のビューがスタックにプッシュされます。このビューから、作成したばかりの新しい行にラベルを付けるための多数のテキスト オプションがユーザーに与えられます。次のコードは、選択が行われた後にシングルトン クラスを更新するために使用されます。

- (void)viewWillDisappear:(BOOL)animated {

Disc *disc = [Disc sharedDisc];
[disc.streams insertObject:@"0208" atIndex:0];
[super viewDidAppear:animated];}

行のテキストが選択されたら、戻るボタンを選択して前の TableView に戻る必要があります。ここで問題が発生します。メインの TableView には、「電話番号を追加」というラベルの付いた 1 つのオプションの代わりに、2 つのオプションがあります。

TableView が使用しているシングルトン クラスが更新されていることはわかっています。正しい方法で更新されないのは TableView です。その後、編集/完了を切り替えると、tableView に情報が正しく表示されます。

ViewDidLoad および ViewWillAppear メソッドでシングルトン クラスを更新しようとしましたが、結果は同じで、ビューが初めてリロードされたときに、新しい行が正しく表示されません。

「戻る」BarButton をオーバーライドして、TableView が正しく表示されるようにすることを考えました。

4

1 に答える 1

0

重複行がテーブルビューの更新に関係している理由がよくわかりませんでした。しかし、どういうわけか、2 つのテーブルを作成しているように聞こえますか? または、互いの上に2つのビューコントローラーがありますが、ナビゲーションコードが適切に設定されていると仮定します(タブバーを使用すると、ビューコントローラーの初期化コードが正しくない可能性があります)。

ViewWillAppear のテーブルの内容を変更するものは何でも必要です。

ViewDidLoad で更新する場合でも、重複したセルを取得しますか (通常、ビューが最初に表示されたときにのみ呼び出されます)。戻るときに実行するには、

テーブル データを更新する場合は、ViewWillAppear で [tableview reloadData] を使用します。

他のすべてが失敗した場合は、このバグを追跡するために、tableView オブジェクトに式を追加し、その変化を (デバッグ モードで) 監視することをお勧めします。

于 2010-10-05T11:18:36.067 に答える