【发布时间】:2015-07-29 17:33:18
【问题描述】:
我有一个应用程序,我正在从 Objective-c 转换为 Swift,并且还将其更改为使用动态(而不是静态)表。我可以加载带有实体行的单元格,但我无法弄清楚如何在 @IBAction 函数中引用 UISwitch 值以便将其保存到 CoreData。
谁能告诉我如何做到这一点的简单例子?
【问题讨论】:
标签: swift uitableview core-data xcode6
我有一个应用程序,我正在从 Objective-c 转换为 Swift,并且还将其更改为使用动态(而不是静态)表。我可以加载带有实体行的单元格,但我无法弄清楚如何在 @IBAction 函数中引用 UISwitch 值以便将其保存到 CoreData。
谁能告诉我如何做到这一点的简单例子?
【问题讨论】:
标签: swift uitableview core-data xcode6
在情节提要中,将原型单元格中的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 和所需的对象,使用 convertPoint 和 indexPathForRowAtPoint。)
因此,当您拨动开关并如上所示检索 Core Data 对象时,文本属性随时可用(尽管您可能不需要它)。
【讨论】:
NSFetchedResultsController。
最终我通过使用 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()
}
}
}
}
【讨论】: