对于在我的核心数据中建模的基本抽认卡应用程序,我从SetCard有一对多的关系。

每个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

09-08 01:52