在单元格内单击时更新UISwitch

时间:2014-07-14 21:19:48

标签: ios objective-c uitableview uiswitch

我之前遇到的问题是,如果此人按下UISwitch并点击进入另一个单元格并返回主页,则会显示所有按钮。我正在尝试更新开关,如果用户按下该开关,即使用户点击不同的单元格,它也会保持开启状态。这是我到目前为止,我认为我非常接近。问题是我不知道是什么类型的???或者我应该使用什么变量。我是采取正确的步骤还是以这种方式面对问题?我还需要reloadData表吗?

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

    // Create a switch button on each cell

    UISwitch *switchView = [[UISwitch alloc] init];

    //[switchView setOn:NO animated:YES];

    [switchView addTarget:self action:@selector(updateSwitch:)forControlEvents:UIControlEventValueChanged];

     ??? = (switchView.on) ? YES : NO;

    cell.accessoryView = switchView;

    return cell;
}

- (void)updateSwitch:(id)sender
{
    UISwitch *switcher = (UISwitch *)sender;

    if (switcher.on)
    {
        [switcher setOn: NO animated:YES];
        ??? = NO;
        NSLog(@"OFF");
    }
    else
    {
        [switcher setOn: YES animated: YES];
        ??? = YES;
        NSLog(@"ON");
    }
}

3 个答案:

答案 0 :(得分:0)

表视图中是否有多个开关?如果是这样,您将需要一个位置来存储每个交换机的状态。如果这是一个小数字,您可以为每个属性创建属性。或者,如果它是多个或未确定的数字,您可以将布尔值作为NSNumber存储在NSArray属性中。

如果您只需要跟踪一个开关值,则只需要在您的类上使用布尔属性:

@property (nonatomic, assign) BOOL switchState;

然后在你的代码中你有???你可以做点什么

self.switchState = switchView.on;
...
self.switchState = NO;
...
self.switchState = YES;

我建议不要将其命名为switchState,而是将其命名为交换机应该代表的内容。

答案 1 :(得分:0)

您可以为所有开关分配标签,具体取决于可用的行数和数量。应用与上述Fabian相同的逻辑。将它们保存在某些数组或字典中每当加载表时你需要检查是否为ON / OFF状态。

答案 2 :(得分:0)

在这种情况下,我的建议是将cellViewcellViewController同时创建为UITableViewCellUITableView下的自定义单元格,并将切换添加到cellView上1}}〜 然后将updateSwitch功能复制到cellViewController并将其链接到cellView中的开关 如果您想为每个单元添加功能特性并将其与表

分开,这可能会有所帮助

TableViewCell.h:

@property (strong, nonatomic) IBOutlet UISwitch * switchView;
- (void)updateSwitch:(id)sender;

TableViewCell.m:

@synthesize switchView

- (void)setupCell {
    //setting up your cell here, 
    //add your switch on cellView with Interface Builder or initialise it here
    //you may add parameter here for getting data from your table view
    [switchView addTarget:self action:@selector(updateSwitch:)forControlEvents:UIControlEventValueChanged];
    }

- (void)updateSwitch:(id)sender
{
    UISwitch *switcher = (UISwitch *)sender;

    if (switcher.on)
    {
        [switcher setOn: NO animated:YES];
        NSLog(@"OFF");
    }
    else
    {
        [switcher setOn: YES animated: YES];
        NSLog(@"ON");
    }
}

tableViewControlle r中,您将使用cellViewcellViewController

设置单元格
- (UITableViewCell *)tableView:(UITableView *)tableview cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"table loaded");
    static NSString *tableViewCell = @"tableViewCell";
    TableViewCell *cell = (TableViewCell *)[tableview dequeueReusableCellWithIdentifier:tableViewCell];

    if(cell == nil){
        // load cell view
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil] ;

        for (id oneObject in nib){
            // check if the custom cell class exists            
            if ([oneObject isKindOfClass:[TableViewCell class]]){
                cell = [(TableViewCell *)oneObject initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tableViewCell];
                }
            }
        }
    [cell setupCell];  //setting up your cell here
    return cell;
}


//finally add click cell event and set sender to the switch in the cell view
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

      TableViewCell * cell = (TableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
      [cell updateSwitch:cell.switchView];

} 

如果你不想为你的桌子创建另一个自定义cellViewcellViewController,还有一种方法可以做到这一点...这将是一种简单而懒惰的方法如果您的桌子的单元格不那么复杂

在初始化时为单元格中的开关设置标记

switchView.tag = indexpath.row;

并在- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath中更改带标记

的切换状态