将美国切换到核心数据

Posted

技术标签:

【中文标题】将美国切换到核心数据【英文标题】:Saving USSwitch to CoreData 【发布时间】:2012-03-28 14:55:21 【问题描述】:

我有一个带有自定义单元格的 tableviewController,其中包含一个标签和一个开关。 我将 Switch 的状态保存在 CoreData 中

    - (IBAction)roomSwitch:(id)sender 
    
    NSLog(@"Switch wurde betätigt");
    NSManagedObjectContext *context = [app managedObjectContext];
    
    UISwitch *switcher = sender;
    NSInteger rowInIndexPath = switcher.tag;
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowInIndexPath inSection:0];
    Raumattribute *att=[self.fetchedResultsController objectAtIndexPath:indexPath];
    
    att.switch = [NSNumber numberWithBool:switcher.on];
    
    NSError *error = nil;
    if (![context save:&error]) 
        
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    
    NSLog(@"Schalter: %@", att.switch);
    

这个作品->

2012-03-28 16:43:34.657 Book-App[40011:11903] Switch: 1
2012-03-28 16:43:37.373 Book-App[40011:11903] Switch wurde betätigt
2012-03-28 16:43:37.377 Book-App[40011:11903] Switch: 0

在我的 cellForRowAtIndexPath 我有 [cell.raumSwitch addTarget:self action:@selector(roomSwitch:) forControlEvents:UIControlEventValueChanged];

调用 roomSwitch:

现在我的问题是,如果我改变一个开关,另一个开关也会改变它的状态。如何告诉 Switch 它属于哪一行。

我的第二个问题是,如果我改变视图,所有开关都变为关闭。如何显示保存在 CoreData 中的实际状态?

我试过了:

cell.roomSwitch = [managedObject valueForKey:@"switch"];

但它崩溃了。

【问题讨论】:

【参考方案1】:

您可以做的是为每个与 Row 对应的开关添加一个 Tag 属性。这样,您将确切知道单击了哪个开关/打开了哪一行。要更改开关的状态,您需要 cell.roomSwitch.isOn = YEScell.roomSwitch.isOn = NO

编辑:如果您使用 BOOL 值将其存储在 Core Data 中,则类型为 NSNumber。要更改开关,您需要cell.roomSwitch.isOn = [managedObject.switch boolValue]

您可以更清楚地了解如何使用标签并了解在此 UIButton 示例中更改了哪一行的开关,这基本相同: Detecting which UIButton was pressed in UITableView

【讨论】:

【参考方案2】:

我认为最简单的解决方案是将 uitableviewcell 子类化为原型,并在该子类中将 IBOutlet 用于开关,并存储指向托管对象的指针。每次配置单元格时,设置对象并根据该对象切换值。

每次触发 switch 事件时,对象已经在触发的单元格中。

【讨论】:

【参考方案3】:

我想我得到了它的工作,他只改变了轻按的开关

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

  RaumAttributeCell *cell =(RaumAttributeCell *)[tableView dequeueReusableCellWithIdentifier:@"attributCell"];


NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.raumAttributLabel.text = [managedObject valueForKey:@"attributname"];



NamedUISwitch *mySwitch = [[NamedUISwitch alloc] initWithFrame:CGRectZero];
[mySwitch addTarget:self action:@selector(raumSwitch:) forControlEvents:UIControlEventTouchUpInside];


cell.accessoryView = mySwitch;
[cell.contentView addSubview:mySwitch];



mySwitch = [cell.contentView.subviews objectAtIndex:0];
[mySwitch setTag:indexPath.row];

return cell;

- (IBAction)raumSwitch:(id)sender 

NSLog(@"Switch wurde betätigt");
NSManagedObjectContext *context = [app managedObjectContext];

UISwitch *switcher = sender;
int row  = switcher.tag;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
Raumattribute *att=[self.fetchedResultsController objectAtIndexPath:indexPath];

att.schalter = [NSNumber numberWithBool:switcher.on];

NSError *error = nil;
if (![context save:&error]) 

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();

NSLog(@"Schalter: %@", att.schalter);

但我仍然不知道如何显示保存在 coreData 中的状态。

也许你可以给我一些代码,我该怎么做?

在我尝试将 Switch 子类化之前

cell.roomSwitch.isOn = [managedObject.switch boolValue]

但是没有用。

【讨论】:

我自己找到了解决方案 mySwitch.on = [[managedObject valueForKey:@"schalter"] boolValue];感谢您的帮助!

以上是关于将美国切换到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

UITableView Swift中带有布尔值的切换按钮

核心数据错误切换到使用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类

如何在 sqlite 核心数据文件之间正确切换?

在选项卡之间切换时获取核心数据

Swift4:在两个核心数据存储之间切换

核心数据子类不会自动生成