【问题标题】:How do I change a switch in CoreData using Dynamic Tables (Swift)如何使用动态表(Swift)更改 CoreData 中的开关
【发布时间】:2015-07-29 17:33:18
【问题描述】:

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

谁能告诉我如何做到这一点的简单例子?

【问题讨论】:

    标签: swift uitableview core-data xcode6


    【解决方案1】:

    在情节提要中,将原型单元格中的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 元素中获取数据。相反,您应该始终将数据存储在模型中,而不是存储在表格视图行中!

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

    因此,当您拨动开关并如上所示检索 Core Data 对象时,文本属性随时可用(尽管您可能不需要它)。

    【讨论】:

    • 蒙迪,谢谢。这很有帮助,但我不使用获取的结果控制器(稍后会考虑)。否则,我需要获取单元格中键 (UITextView) 字段的值才能获取正确的 CoreData 行。你能告诉我怎么做吗?
    • 您提出了许多问题,因此我更新了答案以解决这些问题。
    • Mundi,我将数据存储在数据模型(不是数组)中,但是当用户更改表视图中的开关时,我需要更新它。该单元格包含两个字段... textview 是数据模型中实体的键和开关(它是一个属性)。我想要做的是更新数据模型中的开关设置。如果我没有说清楚,我很抱歉。 (我目前的方法是从实体中获取行,但我需要将 textview 作为谓词的一部分。)
    • 这是一场灾难。请执行NSFetchedResultsController
    • 如果我实现它,我该如何指定谓词?这是我不明白的部分。
    【解决方案2】:

    最终我通过使用 cellForRowAtIndexPath 来从我的自定义 UITableViewController 类中的数据模型中加载单元格并在我的自定义 UITableViewCell 类中使用以下代码解决了这个问题。 (可能这就是 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()
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-10
      • 2016-11-27
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多