2016-07-23 3 views
1

今日のウィジェット拡張でコアデータ属性を読み込もうとしています。私はここで多くのウェブサイトや質問を検索しましたが、解決策を見つけることができませんでした!これまでのところ、私は私のアプリにアプリのグループを追加し、その後App Delegateにこの行を変更します。ウィジェット拡張からコアデータにアクセス

lazy var applicationDocumentsDirectory: NSURL = { 
    // file. This code uses a directory named "compony.AppName" in the application's documents Application Support directory. 
    let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    return urls[urls.count-1] 
}() 

へ:

lazy var applicationDocumentsDirectory: NSURL? = { 
    return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.myDomain.appgroupID") ?? nil 
}() 

ので、次のステップは何ですか?ウィジェットセンターからコンテキストエンティティなどにアクセスするにはどうしたらいいですか?身体が私を助けてくれたら嬉しいです。

entityには、複数のattributesが1つしかありません。

EDIT

  • 私はCoreDataStack.swiftを作成し、AppDelegateから新しいファイルにすべてのコアデータファイルをコピーしました。私は疲れたモデルからデータを取得するために拡張viewDidLoad

enter image description here

  • を私はウィジェット実行したときに何も起こりません::

  • は、拡張子をウィジェットに自分のデータモデルを追加しました

    context = CoreDataStack.defaultStack.managedObjectContext 
    
    do { 
    
        request = NSFetchRequest(entityName: "Event") 
        results = try context.executeFetchRequest(request) 
        print(results.count) 
    
        if results.count > 0 { 
    
         for item in results as! [NSManagedObject] { 
    
          let name = item.valueForKey("title") 
    
          print(name!) 
         } 
    
        }//end if 
    
    
    } catch { 
    
        print("there is an error for saving") 
    } 
    
+1

すべての必要な手順を踏んだことがありますか?たとえばhttps://www.invasivecode.com/weblog/sharing-data-between-apps-/ –

+0

@LorenzoBoaroこれは私が今まで見た中で最も馬鹿なチュートリアルです!タイトルはコアデータと今日の拡張機能ですが、最後のステップに従うとコアデータは必ずしも良いとは言えません!!!!! !!!使用NSUserDefualts !!!!!!!!!!!!!! –

答えて

4

ウィジェットにはアプリケーションデリゲートがないので、メインアプリケーションのアプリケーションデリゲートクラスからコアデータスタックコードを移動したい場合があります。

私は通常、CoreDataStackというクラスを使用します。ただ、staticlazyを変更し、この新しいクラスにメソッドのすべてをコピーします。

class CoreDataStack { 
    static var applicationDocumentsDirectory: NSURL? = { ... }() 
    static var managedObjectModel: NSManagedObjectModel = { ... }() 
    static var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { ... }() 
    static var managedObjectContext: NSManagedObjectContext? = { ... }() 
} 

これらはすべてstatic変数であるため、あなたが管理コンテキストにアクセスするには、次の構文を使用することができます。

let ctx = CoreDataStack.managedObjectContext 

を。 ..あなたのアプリケーションデリゲートを通じた典型的なアクセスの代わりに。

「ターゲットメンバーシップ」の右側のサイドバーを使用して、メインアプリケーションターゲットとウィジェットターゲットの両方にこのファイルを追加する必要があります。この方法で、両方の場所で同じ方法でコアデータスタックにアクセスします。

+0

@ Mc.Loverとても申し訳ありません...私はあなたのコメントの通知を受け取りませんでした。 CoreDataStackクラスを直接使用し、そのインスタンスをインスタンス化しないようにしてください。あなたのクラスをペーストしてエラーがどこにあるのか教えてください。私は数分で助けることができます –

+0

また、各静的変数宣言の最後に()を忘れていないことを確認してください。 –

+0

クラスはシングルトンではありませんそれは可能な解決策です)。 CoreDataStack.defaultStack.managedObjectContextでアクセスするのではなく、CoreDataStack.managedObjectContext @ Mc.Loverを使用してください。 –

関連する問題