2015-01-15 52 views
-1

我有两个实体与coredata关系:fetchRequest.predicate与Coredata运行正常使用Objective-C,但不是迅速

实体“Kategorien”有关系的“一对多”到被称为实体“细节” “kategorie”

enter image description here

在controllerA与 “Kategorien” 我选择 “Kategorien”,并达到控制器 “DetailViewController” 与 “细节”:

斯威夫特:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "MainDetail" { 
     let indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()! 
     let controller = segue.destinationViewController as DetailViewController 
     let kat:Kategorien = self.fetchedResultsController.objectAtIndexPath(indexPath) as Kategorien 

     controller.kategorie = kat  } 
} 

在DetailViewController我接收它:

class DetailViewController: UITableViewController, NSFetchedResultsControllerDelegate { 

    var kategoie:Kategorien! 

目标C吉是一个属性在DetailViewController.h

@property (strong, nonatomic) Kategorien *kat; 

并在fetchResulController我只是说

#pragma mark - Fetched results controllers delegates 
- (NSFetchedResultsController *)fetchedResultsController { 
... 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"kategorie == %@", kat]; 

并显示了kategorie的记录。

随着在fetchResulController 斯威夫特我尝试了与

fetchRequest.predicate = NSPredicate(format:"kategorie == %@", kategorie) 

等方式(即kategorie.description),但

没有记录将显示

Whar我有没有missunderstand ?我的错误在哪里?它驱动我疯狂 ...

+0

为什么它在Objective-C中创建Swift谓词和'kat'时是'kategorie'? - (如果你提供一个*链接*到你的核心数据模型的屏幕截图,那么友好的用户可能会将它添加到你的问题:) – 2015-01-15 18:52:54

+0

对不起:kategorie是在Swift和kat在Objective-C中。我都是一样的。我如何提供链接? – 2015-01-15 19:22:46

+0

例如,您可以将图像上传到http://imgur.com并在此处张贴链接。 – 2015-01-15 19:25:15

回答

0

我得到它! :-) 接过雷Wenderlichs的解决方案“核心数据通过教程”来管理MOC:

import CoreData 
public class CoreDataStack { 
    let context:NSManagedObjectContext 
    let psc:NSPersistentStoreCoordinator 
    let model:NSManagedObjectModel 
    let store:NSPersistentStore? 
    ... 

此类由AppDelegate.swift(无MOC ...)调用,ViewControllers。但是这总会创造一个新的MOC!所以“Kategorien”和“Details”都有自己的MOC。 所以fetchRequest

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"kategorie == %@", kategorie] 

在细节有另一个MOC作为kategorien从controllerA了。

现在我杀死了类CoreDataStack并移植到AppDelegate.swift请参阅Swift: cannot preload Coredata。现在所有使用相同的MOC,一切都很好...... :-)

2

该构造函数不能在swift中使用,因为它使用可变参数。

相反,Objective C的构造函数:

+ (NSPredicate *)predicateWithFormat:(NSString *)format 

使用SWIFT构造:

init(format predicateFormat: String, 
    argumentArray arguments: [AnyObject]?) -> NSPredicate 

所以,你的代码应该是这样的:

fetchRequest.predicate = NSPredicate(format:"kategorie == %@", argumentArray:[kategorie]) 
+0

THX亚历克斯,但我得到了errormessage“无关的参数标签”参数“在通话中”,你可以帮助吗??? – 2015-01-16 13:53:54

+0

尝试新版本如果有疑问,请点击Xcode中的符号NSPredicate看看实际的API。代码完成也是你的朋友 – 2015-01-16 15:04:27

+0

是的,我这样做了,但仍然没有Child-Records(???)可能是,原因是,我使用了一个sqlite-文件从Objective-C版本迁移???? – 2015-01-16 18:02:37