如何使用动态表更改 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 以及所需的对象,使用 convertPoint
和 indexPathForRowAtPoint
。)
因此,当您按下开关并如上所示检索核心数据对象时,文本属性随时可用(尽管您可能不需要它)。
最终,我通过使用 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()
}
}
}
}
我有一个正在从 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 以及所需的对象,使用 convertPoint
和 indexPathForRowAtPoint
。)
因此,当您按下开关并如上所示检索核心数据对象时,文本属性随时可用(尽管您可能不需要它)。
最终,我通过使用 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()
}
}
}
}