0

UITableViewControllerはデータを持っています。行をタップすると既存のデータを編集でき、 の + をタップUIBarButtonItemすると新しい情報を追加できます。Segue がコア データ オブジェクト(vc.managedObjectID) を渡すと、「詳細」View Controller が firstName フィールドにデータがあるかどうかを確認します。

Objective-Cでは、このようなことをします

- (void)refreshInterface
{
    CoreDataHelper *cdh = [CoreDataHelper sharedHelper];
    Cues *existingCues = (Cues*)[cdh.context existingObjectWithID:_cuesNSManagedObjectID error:nil];

    if (!existingCues.cuesName)
    {
        _cueNameTextField.text           = nil;
        self.cueDescriptionTextView.text = nil;
    }
    else
    {
        _cueNameTextField.text           = existingCues.cuesName;
        self.cueDescriptionTextView.text = existingCues.cuesDescription;
    }
}

firstName にデータがあるかどうかを確認するのに問題があります: var firstName = playerInformation.firstName は、新しいオブジェクトを追加するときにのみ EXC_BAD_ACCESS を引き起こします (playerInformatin が空であることを意味します)。タップして既存のデータを表示すると、正しいデータが返されます。データ。Swift で playerInfomation が空 (新しいレコード) かデータ (既存のデータ) があるかどうかを確認するにはどうすればよいですか?

func refreshInterface(){

    if managedObjectID != nil {
        var playerInformation = managedObjectContext?.existingObjectWithID(managedObjectID!, error: nil) as? PlayerInformation

        var firstName = playerInformation!.firstName //EXC_BAD_ACCESS
        println("firstName \(firstName)")
    }
}

セグエの準備

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "addPlayerInformationDetail" {

            println("addPlayerInformationDetail")

            let context = self.fetchedResultsController.managedObjectContext

            let entity  = self.fetchedResultsController.fetchRequest.entity

            let playerInformation = NSEntityDescription.insertNewObjectForEntityForName(entity.name, inManagedObjectContext: managedObjectContext!) as PlayerInformation?

            var vc  = segue.destinationViewController as PlayerInformationDetailTableViewController

            vc.managedObjectID = playerInformation?.objectID

        } else if segue.identifier == "editPlayerInformationDetail" {


            println("editPlayerInformationDetail")

            var indexPath:NSIndexPath = tableView.indexPathForSelectedRow()!

            var vc                    = segue.destinationViewController as PlayerInformationDetailTableViewController

            vc.managedObjectID        = self.fetchedResultsController.objectAtIndexPath(indexPath).objectID

        }
4

2 に答える 2

0

何らかの理由でこれが機能します:

var playerInformation = managedObjectContext?.existingObjectWithID(managedObjectID!, error: nil)
var firstName: AnyObject? = playerInformation?.valueForKey("firstName")
println("firstName \(firstName)")

managedObjectContext を PlayerInformation としてサブクラス化すると、EXC_BAD_ACCESS が返されます。

于 2014-10-03T00:12:33.523 に答える