2016-04-23 2 views
0

連絡先を追加/編集できる場所を設定しようとしています。 しかし、CoreDataStack.contextを呼び出そうとすると、値がゼロになります。CoreDataStackの管理されたコンテキストがナビゲーションバーに残っていません

ここでは、私が私の最初のビューコントローラに渡すとrootViewControllerの内側に、私は別のビューコントローラに私を送信ボタンを持ってAppDelegate

lazy var coreDataStack = CoreDataStack() 


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 
    UINavigationBar.appearance().barTintColor = navigationMainColor 
    UINavigationBar.appearance().tintColor = navigationMainItemColor 

    let navigationController = window!.rootViewController as! UINavigationController 
    let listViewController = navigationController.topViewController as! ViewController 
    listViewController.coreDataStack = coreDataStack 

    return true 
} 

に由来します。私がprint(coreDataStack)を呼び出すと、rootViewControllerではCoreDataStackコンテキストがまだそこにあります。だから私はそれが最初のビューに存在することを知っています。私が連絡先ページに行くために押すボタンは、ツールバーのバーボタンです。

可能性のある問題1は、ナビゲーションバーを移動したり移動したりしていない可能性がありますが、すべてのビューはナビゲーションスタックに埋め込まれている可能性があります。

NSManagedObjectContextを渡すために、最初のView Controller内でPrepForceを準備する必要がありますか?

また、連絡先と新しい連絡先ビューコントローラの間にナビゲーションコントローラがあります。しかし、その前には何も返されていないようだ。連絡先で は、ユーザーが連絡先を追加しようとしているかどうかを確認するコントローラprepareForSegueがここ

else if segue.identifier == "AddContact" { 
     let navigationController = segue.destinationViewController as! UINavigationController 
     let addViewController = navigationController.topViewController as! NewContactViewController 
     let contactEntity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: coreDataStack.context) 

     let newContact = Contact(entity: contactEntity!, insertIntoManagedObjectContext: coreDataStack.context) 

     addViewController.contact = newContact 
     addViewController.context = newContact.managedObjectContext 
     addViewController.delegate = self 
    } 

発見されたと私は取得していますエラーは、私が試してみて、新しい連絡先を作成するときcoreDataStack.contextがあるということです見ますnilを返す。私は何時間も何時間もこれを追い払ってきており、私は本当に小さいか大きいものを見逃していると思う。いずれにしても、私はコアデータを学び、より良くなっていきたいだけです。

答えて

0

を使用してアクセスすることができます定義されているので、 NSManagedObjectContextを渡しますか?

はい、これはまさに問題です。あなたは物事を配置したい場所をAppleは予測できないので、あなたはあなたの依存性注入を自分で行う必要があります:)

あなたの着信(宛先)ビューコントローラがナビゲーションコントローラに包まれている場合は、安全にtopViewControllerがあなたのビューであることを指してをとることができますコントローラー(これをテストすることができます)を挿入してください。

ナビゲーションコントローラを取得してから、宛先コントローラを取得するだけですか?最初のView Controllerのprepareforsegueのdestinationcontroller.context = self.contextの問題ですか?

他の方法でラウンド:

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    guard let destinationNavController = segue.destinationViewController as? UINavigationController else { 
     print("Unexpected view controller: \(seque.destinationViewController.self)") 
    } 
    guard let myViewController = destinationNavController.topViewController as? MyViewController else { 
     print("Unexpected view controller: \(destinationNavController.topViewController.self)") 
    } 
    myViewController.context = context 
} 

必要に応じて、あなたのクラス名と作品を交換してください。

ええ、今私は、私がContactViewControllerをUINavigationControllerにダウンキャストできないという奇妙なエラーが発生していると考えました。 ContactViewControllerがナビゲーションスタックにない可能性はありますか?

[OK]をクリックします。あなただけのナビゲーションスタックにView Controllerをpop'ingているなら、あなたは宛先として直接ContactViewControllerを得ている、あなたは、このようなナビゲーションコントローラスキップすることができます:セグエはNEWを指している場合

func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    guard let myViewController = segue.destinationViewController as? MyViewController else { 
     print("Unexpected view controller: \(destinationNavController.topViewController.self)") 
    } 
    myViewController.context = context 
} 

UINavigationControllerそれから間違ったことがあります。

+0

ナビゲーションコントローラを手に入れて、目的地のコントローラを取得するだけですか?最初のView Controllerのprepareforsegueのdestinationcontroller.context = self.contextの問題ですか? – ggworean

+0

私が何を参照しているかを示すために、回答が更新されました。 –

+0

ああ、この準備は第2のビューコントローラーにあり、その受信タイプは準備中です。素晴らしい、ありがとう – ggworean

0

あなたのcoredatastackは、シングルトンクラスのオブジェクトである必要があります。今では新しいcoredataアプリケーションを作成する日があります.Apple自身がAppDelegateで配管コードを作成します。 AppDelegateはシングルトンクラスなので、アプリケーションの任意の場所でAppDelegate.coredatastackとしてcoredatastackにアクセスできます。 また、あなたはviewcontrollersでそれを渡す必要はありませんAppdelegateでcoredatastackは、直接私がするために、最初のビューコントローラ内prepareForSegueする必要がありますか

let delegate = UIApplication.sharedApplication().delegate as AppDelegate 
delegate.coredatastack 
+1

シングルトンは本当にこの状況で使用されるべきではありません。 Appleのテンプレートは非常に貧弱な例であり、シングルトンの作成を提案していません。さらに、あなたの答えは、OPが実際の問題を解決するのに役立つものではありません。 –

+0

クエストは、coredatastackコンテキストが持続しないことを示します。 Coredataコンテキストはシングルトンオブジェクトでなければなりません。 Appleと他のすべてのチュートリアルはそれだけに基づいています。 Apple自身がデフォルトでAppDelegateでそれをシングルトンとして作成します。 –

+0

が正しくありません。 Appleのテンプレートは、AppDelegateでCore Dataスタックの作成を示しました。まず、AppDelegateはシングルトンではありません**。オブジェクトの1つのインスタンスがあるということだけが、それがシングルトンであることを意味するわけではありません。次に、Appleのテンプレートは、このスタックを実装する方法の貧弱な例です。古いコードです。今年の3月に更新された[Core Data Programming Guide](https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/index.html)を見て確認することができます。 –