从自定义表格单元访问UISwitch

时间:2013-09-05 17:24:58

标签: ios core-data

我目前正在开展第二个专注于CoreData和Custom Cells的项目。

我有一个带图像的自定义单元格&标签&切换,我试图在交换机的值发生变化时将交换机的值保存到userdefaults。但我仍然坚持如何单独访问每个开关(在我的表视图的同一部分有2个),因此当按下开关时,存储在userdefaults中的整数会立即更新。

这是关于自定义单元格的.m文件中的代码(switchCell)为任何凌乱的代码等道歉,我几乎100%自学,没有任何关于我正在犯的任何错误的建议/反馈。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

UITableViewCell *cell = nil;

// Code for the first section, controlling which cells use the custom cell SwitchCell
if (indexPath.section == 0)
{
    if(indexPath.row == 1 || indexPath.row == 2)
    {
        SwitchCell *switchCell = [tableView dequeueReusableCellWithIdentifier:@"SwitchCellIdentifier"];
        cell = switchCell;
    }

    else
    {
        if(cell == nil)
        {
            cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"CellIdentifier"];
            UISwitch *testSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
            cell.accessoryView = testSwitch;
        }
    }

}
// Each other section currently uses the standard cell type
else
{
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc]  initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"CellIdentifier"];
    }

}

[self configureCell:cell atIndexPath:indexPath];

return cell;
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{

NSDictionary *dictionary = [settingsTableData objectAtIndex:indexPath.section];
NSArray *array = [dictionary objectForKey:@"Settings"];
NSString *cellValue = [array objectAtIndex:indexPath.row];
SwitchCell *switchCell = (SwitchCell *)cell;

[[NSUserDefaults standardUserDefaults] synchronize];

// Integers to store the on/off state of each switch (2)
NSInteger capsValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"capitalsSwitchOn"];
NSInteger numbersValue = [[NSUserDefaults standardUserDefaults] integerForKey:@"numbersSwitchOn"];
NSLog(@"Upon load capsValue equals : %d", capsValue);
NSLog(@"upon load numbersValue equals : %d", numbersValue);

// Setting individual cell values for attributes such as image and text
if (indexPath.section == 0)
{
    if(indexPath.row == 1)
    {
        switchCell.switchCellLabel.text = cellValue;
        switchCell.switchCellImage.image = [UIImage imageNamed:@"capitalsImage.jpg"];

        // Set to true or false depending on what you want the default value to be.
        //switchCell.switchCellSwitch.on = FALSE;

        if (capsValue == 1) {
            [switchCell.switchCellSwitch setOn:NO animated:YES];
        } else
            [switchCell.switchCellSwitch setOn:YES animated:YES];

    }
    else if (indexPath.row == 2)
    {
        switchCell.switchCellLabel.text = cellValue;
        switchCell.switchCellImage.image = [UIImage imageNamed:@"capitalsImage.jpg"];

        if (numbersValue == 1) {
            [switchCell.switchCellSwitch setOn:NO animated:YES];
        } else
            [switchCell.switchCellSwitch setOn:YES animated:YES];
    }
    else
    {
        cell.textLabel.text = cellValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}
else if (indexPath.section == 1)
{
    if (indexPath.row == 0)
    {
        cell.textLabel.text = cellValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else if (indexPath.row == 1)
    {
        cell.textLabel.text = cellValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}
else if (indexPath.section == 2)
{
    if (indexPath.row == 0)
    {
        cell.textLabel.text = cellValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    else if (indexPath.row == 1 || indexPath.row == 2)
    {
        cell.textLabel.text = cellValue;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}

}

提前感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

我会在子类单元格中添加该开关,而不是在viewController中添加。然后在cell子类中创建一个委托,它将在viewController中调用类似switchDidChangeValue的方法。设置了默认值。

答案 1 :(得分:0)

将IBAction添加到SwitchCell

在头文件中添加:

- (IBAction)switchChanged: (UISwitch*)sender;

在.m文件中应用:

- (IBAction)switchChanged: (UISwitch*)sender {
    BOOL value = sender.isOn;

    // Do your Core Data work here
}

您可能必须向SwitchCell添加属性,以便它知道要创建/更改的数据库条目。

然后进入Storyboard或.nib文件,单击UISwitch,打开对象检查器中的最后一个Tab。在那里你应该能够看到Send Events -> Value Changed。将连接从那里拖到你的SwitchCell,选择你的IBAction,你应该好好去。

答案 2 :(得分:0)

如此多的代码:-)如果我理解你的想法,我就不会发牢骚。但我想也许你可以在viewController中为两个开关定义两个属性,switchOne和switchTwo,然后在函数中分配它们

tableView:cellForRowAtIndexPath:

当我在分组tableView中有独立控件时,我总是这样做。

我仍然对您的代码有疑问:

  1. 您的意思是第一部分中的第二个和第三个单元格是带开关的单元格吗?

  2. 我想在你的代码中

    if(indexPath.row == 1 || indexPath.row == 2){
    SwitchCell * switchCell = [tableView dequeueReusableCellWithIdentifier:@“SwitchCellIdentifier”];
    cell = switchCell; } 单元格将始终为零,因为您从未构建标识符为“SwitchCellIdentifier”的单元格

  3. 我认为你为第一部分的其他单元格构建开关控件,所以我完全不知道你想要什么

  4. 早上2点在中国这里,我整夜工作,我很努力,所以也许你的代码是对的,我误解了,如果是的话,请告诉我。