你如何从 Swift 中的 NSManagedObject 获取 NSSet?
How do you fetch NSSet from NSManagedObject in Swift?
对于在我的核心数据中建模的基本抽认卡应用程序,我有从 Set
到 Card
的一对多关系。
每个 Set
都有一个集合名称、集合描述和许多 card1 的关系。每个 Card1
都有正面、背面和照片。在我的 table 视图中,我设法从核心数据中检索所有已保存的 Set
并显示它们。现在我想在用户单击我的下一个视图控制器中的相应单元格时获取每个 Set
的卡片。
这是我的 table 视图控制器代码:
// MARK: Properties
var finalArray = [NSManagedObject]()
override func viewDidLoad() {
getAllSets()
println(finalArray.count)
}
func getAllSets() {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName:"Set")
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest,error: &error) as? [NSManagedObject]
println("Am in the getCardSets()")
if let results = fetchedResults {
finalArray = results
println(finalArray.count)
}
else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
// MARK: Displaying the data
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return finalArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SetTableViewCell
let sets = finalArray[indexPath.row]
cell.setName.text = sets.valueForKey("setName")as? String
cell.setDescription.text = sets.valueForKey("setDescription")as? String
return cell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowDetail" {
let dest = segue.destinationViewController as! Display
// Get the cell that generated this segue.
if let selectedCell = sender as? SetTableViewCell {
let indexPath = tableView.indexPathForCell(selectedCell)!
let selectedSet = finalArray[indexPath.row]
dest.recievedSet = selectedSet
}
}
}
在我的目标视图控制器中,我将如何检索 recievedSet
中的所有卡片?我尝试将 NSSet 转换为数组并将其转换为 [Card1]
数组,但是当我尝试将第一个 Card1 的前字符串 属性 显示到标签上时,应用程序崩溃,给我错误
CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject'
fatal error: Array index out of range
这是我的详细代码viewController。
@IBOutlet weak var front: UILabel!
var finalArray = [Card1]()
finalArray = retrievedSet.allObjects as![Card1]
front.text = finalArray[0].front
给你的细节控制器一个 属性 类型 CardSet
(我使用 "CardSet" 因为 "Set" 是一个 Swift 内置类型名称)。您将所选集传递给此控制器。
您可以使用 属性 进行排序,或者使用 allObjects
生成没有特定顺序的数组。
var cardArray = [Card1]()
var cardSet: CardSet?
viewDidLoad() {
super.viewDidLoad()
if let validSet = cardSet {
cardArray = validSet.cards.allObjects as! [Card1]
}
}
您的代码无效,因为 finalArray
属于 [CardSet]
类型,因此 finalArray[indexPath.row]
属于 CardSet
类型,无法转换为 NSSet
类型.而 与 Card1
的关系 正是您正在寻找的 NSSet
。
最后,我建议给细节控制器一个NSFetchedResultsController
,有一个属性来排序,并在获取的结果控制器的谓词中使用传递的CardSet
。
对于在我的核心数据中建模的基本抽认卡应用程序,我有从 Set
到 Card
的一对多关系。
每个 Set
都有一个集合名称、集合描述和许多 card1 的关系。每个 Card1
都有正面、背面和照片。在我的 table 视图中,我设法从核心数据中检索所有已保存的 Set
并显示它们。现在我想在用户单击我的下一个视图控制器中的相应单元格时获取每个 Set
的卡片。
这是我的 table 视图控制器代码:
// MARK: Properties
var finalArray = [NSManagedObject]()
override func viewDidLoad() {
getAllSets()
println(finalArray.count)
}
func getAllSets() {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName:"Set")
var error: NSError?
let fetchedResults = managedContext.executeFetchRequest(fetchRequest,error: &error) as? [NSManagedObject]
println("Am in the getCardSets()")
if let results = fetchedResults {
finalArray = results
println(finalArray.count)
}
else {
println("Could not fetch \(error), \(error!.userInfo)")
}
}
// MARK: Displaying the data
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return finalArray.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! SetTableViewCell
let sets = finalArray[indexPath.row]
cell.setName.text = sets.valueForKey("setName")as? String
cell.setDescription.text = sets.valueForKey("setDescription")as? String
return cell
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowDetail" {
let dest = segue.destinationViewController as! Display
// Get the cell that generated this segue.
if let selectedCell = sender as? SetTableViewCell {
let indexPath = tableView.indexPathForCell(selectedCell)!
let selectedSet = finalArray[indexPath.row]
dest.recievedSet = selectedSet
}
}
}
在我的目标视图控制器中,我将如何检索 recievedSet
中的所有卡片?我尝试将 NSSet 转换为数组并将其转换为 [Card1]
数组,但是当我尝试将第一个 Card1 的前字符串 属性 显示到标签上时,应用程序崩溃,给我错误
CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject'
fatal error: Array index out of range
这是我的详细代码viewController。
@IBOutlet weak var front: UILabel!
var finalArray = [Card1]()
finalArray = retrievedSet.allObjects as![Card1]
front.text = finalArray[0].front
给你的细节控制器一个 属性 类型 CardSet
(我使用 "CardSet" 因为 "Set" 是一个 Swift 内置类型名称)。您将所选集传递给此控制器。
您可以使用 属性 进行排序,或者使用 allObjects
生成没有特定顺序的数组。
var cardArray = [Card1]()
var cardSet: CardSet?
viewDidLoad() {
super.viewDidLoad()
if let validSet = cardSet {
cardArray = validSet.cards.allObjects as! [Card1]
}
}
您的代码无效,因为 finalArray
属于 [CardSet]
类型,因此 finalArray[indexPath.row]
属于 CardSet
类型,无法转换为 NSSet
类型.而 与 Card1
的关系 正是您正在寻找的 NSSet
。
最后,我建议给细节控制器一个NSFetchedResultsController
,有一个属性来排序,并在获取的结果控制器的谓词中使用传递的CardSet
。