你如何从Swift中的NSManagedObject获取NSSet?

时间:2015-09-19 20:53:37

标签: ios swift core-data nsset

对于在我的核心数据中建模的基本Flashcard应用,我在CardSet之间有一对多的关系。

每个Card1都有一个集名称,集描述和许多card1s的关系。每个Set都有正面,背面和照片。在我的表格视图中,我设法从核心数据中检索所有已保存的Set并显示它们。现在,当用户点击我的下一个视图控制器中的相应单元格时,我想要获取每张// 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

在我的目标视图控制器中,如何检索[Card1]中的所有卡片?我尝试将NSSet转换为数组并将其转换为CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject' fatal error: Array index out of range 数组但是当我尝试在标签上显示第一个Card1的前String属性时,应用程序崩溃了,给了我错误

@IBOutlet weak var front: UILabel!

var finalArray = [Card1]()
finalArray = retrievedSet.allObjects as![Card1]
front.text = finalArray[0].front

这是我详细的viewController的代码。

cat

1 个答案:

答案 0 :(得分:1)

为您的详细控制器提供var infoWindowContent = [ ['<div class="info_content">' + '<h3>' + markers[i][2] + '</h3>' + '<p>' + markers[i][3] + '</p></div>'] ]; 类型的属性(我使用&#34; CardSet&#34;因为&#34; Set&#34;是Swift内置类型名称)。您将所选集传递给此控制器。

您可以拥有一个属性,您可以通过该属性对CardSet的特定订单进行排序或生成数组。

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 s是您正在寻找的Card1

最后,我建议给详细控制器一个NSSet,有一个要排序的属性,并在获取的结果控制器的谓词中使用传递的NSFetchedResultsController