

![最初はこの状態です。](https://i.stack.imgur.com/sMt7N.png)

![Option 1というところをクリックすると、このような状態になります。](https://i.stack.imgur.com/U5V1K.png)

![もう一度Option
1を押すと、Comboboxは閉じるのですが、もう一度クリックするとこの画像のようになってしまいます。](https://i.stack.imgur.com/HmoUE.png)

上記の画像のように、Cellを選択するたびに、表示が反転してしまいます。

これが、UITableViewのdidSelectRowAtIndexPathです。

[code]

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
        switch ([indexPath section]) {
        case 1: {
    
            switch ([indexPath row]) {
                case 0:
                {
                    DropDownCell *cell = (DropDownCell*) [tableView cellForRowAtIndexPath:indexPath];
    
                    NSIndexPath *path0 = [NSIndexPath indexPathForRow:[indexPath row]+1 inSection:[indexPath section]];
                    NSIndexPath *path1 = [NSIndexPath indexPathForRow:[indexPath row]+2 inSection:[indexPath section]];
                    NSIndexPath *path2 = [NSIndexPath indexPathForRow:[indexPath row]+3 inSection:[indexPath section]];
    
                    NSArray *indexPathArray = [NSArray arrayWithObjects:path0, path1, path2, nil];
    
                    if ([cell isOpen])
                    {
                        [cell setClosed];
                        dropDown1Open = [cell isOpen];
    
                        [tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];
                    }
                    else
                    {
                        [cell setOpen];
                        dropDown1Open = [cell isOpen];
    
                            [tableView insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];
    
                    }
    
                    break;
                }
                default:
                {
                    dropDown1 = [[[tableView cellForRowAtIndexPath:indexPath] textLabel] text];
    
                    NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:[indexPath section]];
                    DropDownCell *cell = (DropDownCell*) [tableView cellForRowAtIndexPath:path];
    
                    [[cell textLabel] setText:dropDown1];
    
                    NSIndexPath *path0 = [NSIndexPath indexPathForRow:[path row]+1 inSection:[indexPath section]];
                    NSIndexPath *path1 = [NSIndexPath indexPathForRow:[path row]+2 inSection:[indexPath section]];
                    NSIndexPath *path2 = [NSIndexPath indexPathForRow:[path row]+3 inSection:[indexPath section]];
    
                    NSArray *indexPathArray = [NSArray arrayWithObjects:path0, path1, path2, nil];
    
                    [cell setClosed];
                    dropDown1Open = [cell isOpen];
    
                    [tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];
    
                    break;
    
                }
            }
    
        }
    
    }
    
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    
[/code]

といった感じなのですが、念のためcellForRowAtIndexPathも載せておきます。

[code]

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil){
    
        switch ([indexPath section]) {
            case 0:{
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    
                cell.textLabel.text = @"first";
                break;
            }
            case 1:{
                switch ([indexPath row]) {
                    case 0: {
    
                        DropDownCell *cell = (DropDownCell*) [tableView dequeueReusableCellWithIdentifier:@"DropDownCell"];
    
                        if (cell == nil){
                            NSLog(@"New Cell Made");
    
                            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"DropDownCell" owner:nil options:nil];
    
                            for(id currentObject in topLevelObjects)
                            {
                                if([currentObject isKindOfClass:[DropDownCell class]])
                                {
                                    cell = (DropDownCell *)currentObject;
                                    break;
                                }
                            }
    
                            if (dropDown1Open) {
                                [cell setOpen];
                            }
    
                            [[cell textLabel] setText:dropDown1];
                        }
    
                        // Configure the cell.
                        return cell;
    
                        break;
                    }
                    default: {
                        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
                        if (cell == nil) {
                            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
                        }
    
                        NSString *label = [NSString stringWithFormat:@"Option %ld", [indexPath row]];
    
                        [[cell textLabel] setText:label];
    
                        // Configure the cell.
                        return cell;
    
                        break;
                    }
                }
    
                break;
            }
    
        }
    }
    return cell;
    }
    
[/code]

はまってしまって、なかなか前に進めません。  
回答の方をよろしくお願い致します。


CC BY-SA 3.0
2015-06-29T20:26:20.173
11861
2015-07-09T08:14:07.053
10343
question
ios objective-c uitableview
UITableViewにて、Cell内にComboBoxを作ったら、なぜか反転してしまいます・・・。


おそらく  
<https://github.com/floriankrueger/iOS-Examples--UITableView-Combo-Box>  
にあるサンプルを参考にしてコーディングしたのだと思います。

サンプルと見比べてみるとすぐわかりますが、  
`cellForRowAtIndexPath`のあなたのコーディングの最初の2行

[code]

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil){
    
[/code]

は、サンプルにはありません。  
あなたが追加したこの部分が不具合の原因だと思います。

`dequeueReusableCellWithIdentifier`は、以前に使ったセルを再利用するメソッドですが、  
別のテーブル行で使ったセルが再利用される可能性があります。  
あなたのコーディングは取得したセルを何もせずそのままメソッドの戻りとして返してしまいますから、  
以前にOption3の表示に使っていたセルをそのままOption1表示用のセルとして返却してしまい、  
テーブル表示を更新すると、表示順序が不正になってしまうのだと思います。

`dequeueReusableCellWithIdentifier`で以前に使ったセルを取得した後は、  
セルの内容をindexPathで指定された行の表示になるよう更新する必要があります。  
参考にしたサンプルコーディングにその処理はもともと入っていて、  
case文のdefault処理の中に

[code]

    NSString *label = [NSString stringWithFormat:@"Option %ld", [indexPath row]];
    [[cell textLabel] setText:label];
    
[/code]

と書かれています。  
つまり、あなたが追加した2行が余計な処理で、それを取り除けば  
case文のdefault処理が動作して正しく表示できるようになるはずです。


CC BY-SA 3.0
2015-07-09T08:14:07.053
12197
2015-07-09T08:14:07.053
9367
11861
answer