UISwitch没有显示在UITable中

时间:2012-08-04 20:38:18

标签: ios xcode xcode4 ios4 xcode4.2

我用一些数据创建了一个UITable,并且我已经包含了一个UISwitch,但是当它运行时它没有显示在表中。

in .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"];
    }


}

对于数据,每件事情都可以,但是没有问题吗?

2 个答案:

答案 0 :(得分:1)

当你在RowAtIndexPath的单元格中设置单元格时,你将框架设置为CGRectZero,一个位于(0,0)的矩形,宽度=高度= 0.然后重置位置,但你从未重置宽度和宽度高度。
在你的2帧.origin行后添加:

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

或者只使用CGRectMake(X,Y,width,height)来制作框架。

答案 1 :(得分:1)

在cellForRowAtIndexPath中,如果单元格为nil,则初始化UISwitch并将其添加到单元格。如果细胞最初不是零怎么办?

让我们说,UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@&#34; Cell&#34;]返回一个有效的单元格,然后根本不会创建任何开关。

您可能想验证您是否已指定&#34; Cell&#34;作为接口构建器中UITableViewCell的标识符,以防万一。

或者,移动代码以在&#34; if(cell == nil)&#34;之外初始化UISwitch。看看这是否解决了您的问题。 &#34; if(cell == nil)&#34;如果dedequeueReusableCellWithIdentifier:返回nil,则假定用于初始化单元格。

此外,您对所有交换机使用的标签号为100,在else块中,您使用标签100的contentView初始化了Switch。如果您有多个交换机,iOS应该为iOS分配哪个UISwitch?您可能需要参考我的post,了解如何正确设置标记号。