对于在我的核心数据中建模的基本抽认卡应用程序,我从Set
到Card
有一对多的关系。
每个Set
都有一个设置名称,设置描述以及许多card1的关系。每个Card1
都有正面,背面和照片。在表格视图中,我设法从核心数据中检索了所有保存的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
中的所有卡片?我尝试将NSSet转换为数组并将其强制转换为[Card1]
数组,但是当我尝试在标签上显示第一个Card1的前String属性时,应用程序崩溃了,出现了错误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
。