如何使用tag属性在自定义单元格的表视图中检查多个UISwitch控件的状态

时间:2014-08-05 15:24:22

标签: ios objective-c uitableview uiswitch

我有自定义UITableViewCell的tableview。单元格有UISwitch个控件。我已将单元格添加到表视图控制器中,并为所有开关执行相同的操作。我在UISwitch方法中添加了cellForRowAtIndexPath的标记值。

当用户更改开关状态时,我想确定更改了什么开关。在这里,我将对UISwitch按钮设置操作。

- (void)viewDidLoad
{
    [super viewDidLoad];
    cell.switchbtn.userInteractionEnabled=YES;
    [cell.switchbtn setOn:YES];
    [cell.switchbtn addTarget:self action:@selector(switchToggled:) forControlEvents:   UIControlEventValueChanged];
    [cell.contentView addSubview:cell.switchbtn];
}

这里我设置了uiswitch的标签值

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

    if (!cell)
    {
        [[NSBundle mainBundle] loadNibNamed:@"cellid" owner:self options:nil];

    }

    cell.switchbtn.tag=indexPath.row;
    NSLog(@"btn tag=%d",cell.switchbtn.tag);
    return cell;
}

这里我调用switchToggled:方法来获取uiswitch状态。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{
  [self switchToggled:cell.switchbtn];
}

我正在获取标记值,每次状态为On。即使状态为关闭。

- (void) switchToggled:(UISwitch *)sender {
    UISwitch *mySwitch = (UISwitch *)sender;

    NSLog(@"tag ==%@",mySwitch);
    if ([mySwitch isOn]) {
        NSLog(@"its on!");
    } else {
        NSLog(@"its off!");
    }
}

2 个答案:

答案 0 :(得分:1)

使用具有直接Cell属性的CGpoint来识别选择哪一行,并且您可以轻松识别该单元的Uiswitch状态甚至更准确,这是我正在使用的一种方法,它对我来说很好。

- (void)switchToggled:(id)sender
{

    CGPoint switchPositionPoint = [sender convertPoint:CGPointZero toView:[self tableName]];
    NSIndexPath *indexPath = [[self tableName] indexPathForRowAtPoint:switchPositionPoint];

    BusinessHoursCell *cell = (BusinessHoursCell*)[self.tableName cellForRowAtIndexPath:indexPath];

    int tag=indexPath.row;

    if (tag==0)
    {
        if (cell.workingDaySwitch.on)
        {
            NSLog(@"its on!");
        }

        else
        {
            NSLog(@"its off!");
        }
    }
}

答案 1 :(得分:0)

我使用以下方案: 在cellForRowAtIndexPath中:..将当前indexPath设置为cell。使用类似- (void)cellAtIndexPath:(NSIndexPath *)path changedSwitchStateToState:(BOOL)state的方法创建协议,为单元格创建控制器委托。 Cell通过调用该委托方法处理开关状态更改。

在控制器中,你应该为dataSource(可能是自定义类)使用一些东西,它存储用于配置单元格的对象,并且有一个类似于- (void)changeSwitchStateToState:(BOOL)state atIndexPath:(NSIndexPath *)path的方法,它获取相应的对象并更新状态。