如何使用动态表更改 CoreData 中的开关 (Swift)

How do I change a switch in CoreData using Dynamic Tables (Swift)

我有一个正在从 objective-c 转换为 Swift 的应用程序,并且还将其更改为使用动态(而不是静态)表。我可以用实体行加载单元格,但我一直无法弄清楚如何在 @IBAction 函数中引用 UISwitch 值以将其保存到 CoreData。

任何人都可以指出如何执行此操作的简单示例吗?

在情节提要中,link 原型单元格中的 UISwitch 到视图控制器中的 @IBAction 处理程序。在处理程序中,确定核心数据对象并根据需要进行操作。

假设你有一个抓取结果控制器(推荐):

@IBAction didFlipSwitch(sender: UISwitch) {
    let point = sender.convertPoint(CGPointZero, toView:tableView)
    let indexPath = tableView.indexPathForRowAtPoint(point)
    let object = fetchedResultsController.objectAtIndexPath(indexPath) as! Thing
    thing.flag = sender.on
}

加法

根据您的问题:如果您没有使用获取的结果控制器(尽管推荐),您可能正在使用像[Thing]这样的数组。您可以将这一行替换为:

let object = dataArray[indexPath.row] // no need to cast to Thing

其次,如果您需要访问单元格中的其他值,您可以使用

访问单元格及其元素
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell
let textToRetrieve = cell.textField?.text

但是,这不是一个好方法,因为您是从 UI 元素获取数据。相反,您应该始终将数据存储在模型 中,而不是 table 视图行中!

因此,Thing 的正确文本属性应该已经由 UITextFieldDelegate 实现设置。 (您可以使用与上述几乎相同的方式获取 indexPath 以及所需的对象,使用 convertPointindexPathForRowAtPoint。)

因此,当您按下开关并如上所示检索核心数据对象时,文本属性随时可用(尽管您可能不需要它)。

最终,我通过使用 cellForRowAtIndexPath 从我的自定义 UITableViewController class 中的数据模型加载单元格和我的自定义 UITableViewCell class 中的以下代码解决了这个问题。 (可能这就是 Mundi 的建议,但如果是这样,我不明白他的意思。)

class CREWTableViewCell: UITableViewCell {

@IBOutlet weak var myTextView: UITextView!
@IBOutlet weak var mySwitch: UISwitch!

@IBAction func changedSwitch(sender: UISwitch) {
    var newDescription = self.myTextView.text // value from cell
    var newSwitchValue = self.mySwitch.on // value from cell

    var fetchRequest = NSFetchRequest(entityName: "Switch")
    var pred1 = NSPredicate(format: "(viewName = %@)",viewName)
    var pred2 = NSPredicate(format: "(switchDescription = %@)",newDescription)
    fetchRequest.predicate = NSCompoundPredicate(type: NSCompoundPredicateType.AndPredicateType, subpredicates: [pred1, pred2])
    // Execute the fetch request
    var error: NSError? = nil
    if let fetchResults = context.executeFetchRequest(fetchRequest, error: &error) as? [Switch]
    {
        var recordCount = 0
        recordCount = fetchResults.count

        if recordCount == 1 {
            var appConfig  = fetchResults [0]
            appConfig.switchValue = newSwitchValue
            if !managedObjectContext!.save(nil) {
                NSLog("Unresolved error ")
                abort()
            }
        }
    }
}