0

UITableViewCellコードにボタンを動的に配置するカスタムs を作成しました。そのようなボタンのアクションをプログラムで設定しました。アクションがトリガーされたら、特にテーブルをリロードする必要があります。リロードが呼び出されると、送信者ボタンが消え、理由がわかりません...誰かが考えられる理由のヒントを教えてくれませんか? ボタンがタップされず、テーブルを上下にスクロールすると、そこに残ります。

ありがとう!

編集

これは からのコード スニペットですcellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSArray *listData =[self.tableViewEntries objectForKey:[self.sortedKeys objectAtIndex:[indexPath section]]];

   UITableViewCell *cell;

   if (indexPath.section == 0) {

    switch (indexPath.row) {
        case 0: {
            cell = [self.tableView dequeueReusableCellWithIdentifier:@"firstCell"];
            ((CustomCell *)cell).cellTextField.tag = firstCellTag;
            cell.tag = firstCellTag;
            break;
        }
        case 1: {
            cell = [self.tableView dequeueReusableCellWithIdentifier:@"secondCell"];
            ((CustomCell *)cell).cellTextField.tag = secondCellTag;
            cell.tag = secondCellTag;
            break;
        }
   } 
   return cell;
}

CustomCell私が定義した は からロードされますnib。これらのセルには、UITextFieldユーザー入力用の とUIView、テキスト フィールド内のユーザー入力に従って、コードでボタンを動的に設定または削除する場所があります。ボタンはコードで作成され、そのアクションもコードで設定されます。

- (void)setButtonForCell:(UITableViewCell *)cell withResult:(BOOL)isValid
{
   UIImage* validationButtonNormalImage = nil;
   UIImage* validationButtonHighlightImage = nil;

   UIButton *validationButton = [UIButton buttonWithType:UIButtonTypeCustom];
   [validationButton setFrame:CGRectMake(0, 0, ((CustomCell *)cell).cellValidationView.frame.size.width, ((CustomCell *)cell).cellValidationView.frame.size.height)];

   if (isValid) {
       validationButtonNormalImage =[[UIImage imageNamed:@"success.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0];
       validationButtonHighlightImage =[[UIImage imageNamed:@"success.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0];

      [validationButton removeTarget:self
                            action:@selector(validationButtonTapped:)
                  forControlEvents:UIControlEventTouchUpInside];
   }
   else {
       validationButtonNormalImage =[[UIImage imageNamed:@"error.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0];
       validationButtonHighlightImage =[[UIImage imageNamed:@"error.png"] stretchableImageWithLeftCapWidth:5.0 topCapHeight:0.0];

      [validationButton setTag:cell.tag];

      [validationButton removeTarget:self
                            action:@selector(validationButtonTapped:)
                  forControlEvents:UIControlEventTouchUpInside];

      [validationButton addTarget:self
                         action:@selector(validationButtonTapped:)
               forControlEvents:UIControlEventTouchUpInside];
   }


   [validationButton setBackgroundImage:validationButtonNormalImage forState:UIControlStateNormal];
   [validationButton setBackgroundImage:validationButtonHighlightImage forState:UIControlStateHighlighted];


   [((CustomCell *)cell).cellValidationView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];
   [((CustomCell *)cell).cellValidationView addSubview:validationButton];
}

次に、 でvalidationButtonTapped:いくつかのタスクを実行して を呼び出し[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:NO];、ビューからボタンを外したときがあります。ただし、ボタンをタップせずに上下にスクロールして「cellForRowAtIndexPath:」を再度呼び出すと、ボタンはここに残ります。リロードを要求するときだけそれを失うようなものです。

何か助けはありますか?

4

1 に答える 1

0

cellForRowAtIndexPath:通常のパターンに従っている場合、セルは通常再利用されます。各セルの prepareForReuse ですべてのサブビューを削除しますか? そうしないと、上下にスクロールすると、セルに予期しないボタンが表示されます。でセルを再利用する (または新しいコードでは、セルをデキューする) ためにセルを取得した、各セルの構成で必要に応じてボタンを追加する必要がありますcellForRowAtIndexPath:

于 2013-08-06T06:40:39.093 に答える