-1

いくつかのデータで UITable を作成し、UISwitch を含めましたが、実行時にテーブルに表示されませんでした。

.h で

@interface CalcViewController : UITableViewController {

    IBOutlet UITableView *mainTableView;

    NSMutableArray *courseMURArray;


    NSMutableArray *switchStates;
}

と.mで

- (void)viewDidLoad
{
    [super viewDidLoad];

    switchStates = [[NSMutableArray alloc] init ];

    int i = 0;

    for (i = 0; i < 33; i++) {
        [switchStates addObject:@"OFF"];
    }
}

そして

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

        UISwitch *theSwitch = nil;


        if (cell == nil) {


            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

            theSwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
            theSwitch.tag = 100;

            CGRect frame = theSwitch.frame;
            frame.origin.x = 230;
            frame.origin.y = 8;
            theSwitch.frame = frame;

            [theSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];


            [cell.contentView addSubview:theSwitch];

        }else{

            theSwitch = [cell.contentView viewWithTag:100];

        }

        if ([[switchStates objectAtIndex:indexPath.row] isEqualToString:@"ON"]) {
            theSwitch.on = YES;
        }else{
            theSwitch.on = NO;
        }

return cell;
}

これがセレクターメソッドです

-(void) switchChanged: (UISwitch *) sender{

    UITableViewCell *theParentCell = [[ sender superview] superview];
    NSIndexPath * indexPathOfSwitch = [mainTableView indexPathForCell:theParentCell];

    if (sender.on) {
        [switchStates replaceObjectAtIndex:indexPathOfSwitch.row withObject:@"ON"];
    }else{
        [switchStates replaceObjectAtIndex:indexPathOfSwitch.row withObject:@"OFF"];
    }


}

データはすべて問題ありませんが、何か問題はありますか?

4

2 に答える 2

1

RowAtIndexPath のセル内のセルを設定すると、フレームが CGRectZero に設定されます。これは、幅 = 高さ = 0 の位置 (0,0) の四角形です。その後、位置をリセットしますが、幅をリセットすることはありません &身長。
2 つの frame.origin 行の後に次を追加します。

  • frame.size.width = XX;
  • frame.size.height = YY;

または CGRectMake(X, Y, width, height) を使用してフレームを作成します。

于 2012-08-05T00:03:22.070 に答える
1

cellForRowAtIndexPath で、セルが nil の場合、UISwitch を初期化してセルに追加します。セルが最初に nil でない場合はどうなりますか?

たとえば、UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"] が有効なセルを返す場合、スイッチはまったく作成されません。

念のため、インターフェイス ビルダーで UITableViewCell の識別子として "Cell" を指定したかどうかを確認することをお勧めします。

または、UISwitch を初期化するためのコードを「if(cell==nil)」の外に移動します。これで問題が解決するかどうかを確認してください。「if(cell==nil)」ブロックは、dedequeueReusableCellWithIdentifier: が nil を返す場合にセルを初期化するためのものと思われます。

また、すべてのスイッチに 100 のタグ番号を使用しており、else ブロックで、タグ 100 の contentView を使用して theSwitch を初期化します。複数のスイッチがある場合、iOS はどの UISwitch を theSwitch に割り当てる必要がありますか? タグ番号を正しく設定する方法については、私の投稿を参照してください。

于 2012-08-06T03:02:40.563 に答える