2

私はプロジェクトに取り組んでおり、ある時点で立ち往生しています。私のプロジェクトには、セル テーブル ビューをクリックするといくつかのデータを含むテーブル ビューがあり、セクションに展開されます。チェックボックスの画像を設定したい(ユーザーがセルをクリックしたとき)という1つのことを除いて、すべて問題ありません。セルをタップすると、セルのタイトル テキストが表示されますが、特定のセル セクションにチェックボックス イメージ ( UITableViewCellAccessoryCheckmarkなど) を設定できません。

以下の画像とコードを投稿しています。

ルート演習名が含まれている MyTableView

ルート演習名が含まれている MyTableView

これは拡張ビューで、セルの右側にチェックボックス (UITableViewCellAccessoryCheckmark) が必要です。

これは拡張ビューで、セルの右側にチェックボックス (UITableViewCellAccessoryCheckmark) が必要です。

**tableView didSelectRowAtIndexPath:** をクリックすると正常に動作します

tableView didSelectRowAtIndexPathをクリックすると、正常に動作します

//コード

     -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        if ([indexPath isEqual:self.selectIndex]) {
            self.isOpen = NO;
            [self didSelectCellRowFirstDo:NO nextDo:NO];
            self.selectIndex = nil;

        }else
        {
            if (!self.selectIndex) {
                self.selectIndex = indexPath;
                [self didSelectCellRowFirstDo:YES nextDo:NO];

            }else
            {

                [self didSelectCellRowFirstDo:NO nextDo:YES];
            }
        }

    }else
    {
        NSDictionary *dic = [dataList objectAtIndex:indexPath.section];
        NSArray *list = [dic objectForKey:@"ExcerciseList"];            //from plist
        NSString *item = [list objectAtIndex:indexPath.row-1];
        UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
        if (thisCell.accessoryType == UITableViewCellAccessoryNone)
        {
            thisCell.accessoryType = UITableViewCellAccessoryCheckmark;

        }
        else
        {
            thisCell.accessoryType = UITableViewCellAccessoryNone;
        }

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:item message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
        [alert show];
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}


   #pragma mark- Table View DataSource and Delegates
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isOpen&&self.selectIndex.section == indexPath.section&&indexPath.row!=0) {
        static NSString *CellIdentifier = @"Cell1";
        _cell = (Cell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!_cell) {
            _cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];

            //[[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSArray *list = [[dataList objectAtIndex:self.selectIndex.section] objectForKey:@"ExcerciseList"];
        _cell.titleLabel.text = [list objectAtIndex:indexPath.row-1];

        //[_cell changecheckboxWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return _cell;
    }
    else
    {

        static NSString *CellIdentifier = @"view_TableView_List";
        cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
        NSString *name = [[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Name"];
        cell.Lbl_Excercise_Name.text = name;
        cell.Lbl_Excercise_Name.font=[UIFont fontWithName:@"Hustlers Rough Demo" size:40.0f];
        NSString *ImageName=[[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Image"];
        [cell.imageView_Excercise_Image setImage:[UIImage imageNamed:ImageName]];
        [cell changeArrowWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return cell;
    }
}

私の質問は、選択したセクションにチェックボックスを表示する方法ですか?

ごめん!適切にフォーマットされていない場合(スタックの新機能)!ありがとう!

4

2 に答える 2

1

これを行う方法については正しい考えがありますが、チェックマークを間違った場所に設定しています。メソッド-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPathを使用して、選択したセルを保存 (記憶) し、アクセサリ タイプを設定しないでください。

一度に 1 つのセルしか選択できない場合は、選択されNSIndexPathたセルを記憶するプロパティを宣言できます。ただし、一度に複数のセルを選択できる場合は、選択したNSMutableArrayすべてのセルを格納できる場所を宣言できます。

次に、メソッド-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathを使用して、選択されたセルにチェックマークを設定する必要があります。

以下に例を示します (複数のセルを選択できると想定しています)。

*.h ファイルでNSMutableArrayプロパティを宣言します

@property (nonatomic, strong) NSMutableArray *selectedCells;

*.m ファイルで、init メソッド内でプロパティを初期化します。

_selectedCells = [[NSMutableArray alloc] init];

次に、didSelectRowAtIndexPath...メソッドで:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if ([self.selectedCells containsObject:indexPath]) {
        [self.selectedCells removeObject:indexPath]; // this line allows the checkmark to be shown/hidden if the user presses several times the same cell
    } else {
        [self.selectedCells addObject:indexPath]; // a cell was selected; remember it
    }

    ... // the rest of your code
}

最後に、cellForRowAtIndexPath...メソッドで

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

    ... // Create, initialize and customize your cell

    // if the cell you're being asked for is saved in the array it means it was selected
    if ([self.selectedCells containsObject:indexPath]) {
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    }
}

以上です。他にご不明な点がありましたらお知らせください

それが役に立てば幸い!

アップデート

カスタム画像をチェックマークとして設定するだけの場合は、次のように、既に機能しているコードを使用しながら、画像を作成してアクセサリ ビューに割り当てます。

// Note that you should use 'accessoryView' and NOT 'accessoryType'
if (thisCell.accessoryView == UITableViewCellAccessoryNone)
{
    thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                                        [UIImage imageNamed:@"YOUR_IMAGE_NAME"]];

}
else
{
    thisCell.accessoryView = nil;
}
于 2013-09-26T18:34:55.327 に答える
1

私はついにそれを機能させることができました。変更する必要があるのは次のとおりです。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.isOpen&&self.selectIndex.section == indexPath.section&&indexPath.row!=0) {
        static NSString *CellIdentifier = @"Cell1";
        _cell = (Cell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (!_cell) {
            _cell = [[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];

            //[[[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil] objectAtIndex:0];
        }
        NSArray *list = [[dataList objectAtIndex:self.selectIndex.section] objectForKey:@"ExcerciseList"];
        _cell.titleLabel.text = [list objectAtIndex:indexPath.row-1];
        _cell.accessoryView = nil;
        if ([self.selectedCells containsObject:indexPath])
        {
            _cell.accessoryView = [[UIImageView alloc] initWithImage:
                               [UIImage imageNamed:@"check_box@2x.png"]];
        }
        //[_cell changecheckboxWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return _cell;
    }
    else
    {

        static NSString *CellIdentifier = @"view_TableView_List";
        cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (!cell) {
            cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }
        NSString *name = [[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Name"];
        cell.Lbl_Excercise_Name.text = name;
        cell.Lbl_Excercise_Name.font=[UIFont fontWithName:@"Hustlers Rough Demo" size:40.0f];
        NSString *ImageName=[[dataList objectAtIndex:indexPath.section] objectForKey:@"Excercise_Image"];
        [cell.imageView_Excercise_Image setImage:[UIImage imageNamed:ImageName]];
        [cell changeArrowWithUp:([self.selectIndex isEqual:indexPath]?YES:NO)];
        return cell;
    }
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
        if ([indexPath isEqual:self.selectIndex]) {
            self.isOpen = NO;
            [self didSelectCellRowFirstDo:NO nextDo:NO];
            self.selectIndex = nil;

        }else
        {
            if (!self.selectIndex) {
                self.selectIndex = indexPath;
                [self didSelectCellRowFirstDo:YES nextDo:NO];

            }else
            {

                [self didSelectCellRowFirstDo:NO nextDo:YES];
            }
        }

    }else
    { 

        NSDictionary *dic = [dataList objectAtIndex:indexPath.section];
        NSArray *list = [dic objectForKey:@"ExcerciseList"];
        NSString *item = [list objectAtIndex:indexPath.row-1];
        UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
        if (!thisCell.accessoryView)
        {
            [self.selectedCells addObject:indexPath];
            thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                                  [UIImage imageNamed:@"check_box@2x.png"]];

        }
        else
        {
            [self.selectedCells removeObject:indexPath];
            thisCell.accessoryView = nil;
        }

//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:item message:nil delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil] ;
//        [alert show];
    }
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

}

これらのメソッドで他に何も変更されていない場合は、コードをコピーして貼り付けるだけで機能します。投稿する前にテストしました。他にご不明な点がありましたらお知らせください

アップデート

これが何が起こっていたのかの説明です。実際にはいくつかの問題がありました。

最初に、あなたはミキシングaccessoryTypeしていaccessoryViewました; これにより、if-else句が正しく実行されませんでした。ここに古いコードがあります

// here you are using accessoryType
if (thisCell.accessoryType == UITableViewCellAccessoryNone)
{
    // but here you're using accessoryView
    thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                              [UIImage imageNamed:@"check_box@2x.png"]];

}
else
{
    // here too...
    thisCell.accessoryView=nil;
    thisCell.accessoryView = nil;
}

次に、選択した要素の indexPaths を保存していませんでした。修正されたコードは次のとおりです (注は同じif-else節です)。

if (!thisCell.accessoryView)
{
    // you have to save the selected indexPaths
    [self.selectedCells addObject:indexPath];
    thisCell.accessoryView = [[UIImageView alloc] initWithImage:
                              [UIImage imageNamed:@"check_box@2x.png"]];

}
else
{
    // if the cell was already selected, then remove the indexPath
    [self.selectedCells removeObject:indexPath];
    thisCell.accessoryView = nil;
}

3 番目に、 の次の行は、別のチェックマークcellForRowAtIndexPath...が表示されていたため、混乱していたので、削除しました。

[_cell.checkUnCheck_ImageView setHidden:NO];

それはほとんどそれでした。

お役に立てれば!

于 2013-09-27T08:07:49.350 に答える