我在我的应用程序中使用CoreData,它是一对多的关系,我有两个名为folders
和files
的实体。所以一个文件夹可以有很多文件。所以我的第一个视图控制器显示所有文件夹,当点击每个文件夹时,我会显示其中的文件。
现在,其中存在的所有文件夹和文件都是由用户动态创建的,并非来自任何数据库或Web服务器。
现在我还有一个视图控制器,我从app delegate打开,在这里我想显示一些文件。
我知道首先我们应该传递managedObjectContext
,它将在app delegate
ViewController *View = [[ViewController alloc]initWithNibName: @"ViewController" bundle:nil]
View.managedObjectContext = self.managedObjectContext;
因此,如果我们只传递managedObjectContext
,我们是否可以访问文件实体对象,或者我们也必须传递文件实体对象。
现在您知道,我有两个实体,名为Folder
和File
,现在可以访问存储在任何文件夹中的文件,我只是这样做。
NSMutableArray *filesArray = [self.folder.file mutableCopy];
但是现在,我想在我想要的任何视图中显示文件,可以在两次三次导航后打开,也可以直接从appDelegate.m打开。
非常清楚,我的问题是如何做到这一点?即如何从AppDelegate
获取filesArray。
基于以下答案编辑。我用这种方式创建了一个fetchResultsController
- (NSFetchedResultsController *)fetchedResultsController {
if (m_fetchResultsController != nil) {
return m_fetchResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"File" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"alarm" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"alarm!= nil"]];
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return m_fetchResultsController;
}
在ViewDidLoad和我这样写的
- (void)viewDidLoad
{
[super viewDidLoad];
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSMutableArray *alarms = [[self.fetchResultsController fetchedObjects]mutableCopy];
NSLog(@"alarmsCount:%d",[alarms count]);
}
此致 兰吉特。
答案 0 :(得分:2)
如果您分享更多详细信息,我们可以为您提供帮助,但与此同时......
如果主控制器显示文件夹而细节控制器显示文件,只需将所选文件夹的引用注入细节控制器。
例如,在详细控制器中创建一个属性(需要合成)
@property (nonatomic,strong) Folders* currentFolder;
创建细节控制器时,请执行以下操作
DetailController* detCtr = // alloc-init here
detCtr.currentFolder = // the folder you want to pass in
一些笔记
使用Camel Case表示法。
使用NSFetchedResultsController
与表格等相关联的延迟加载数据。
以单数形式重命名实体Files
和Folders
。
修改强>
好的,如果您想从应用程序中的任何位置访问您的应用代理,您只需致电
即可AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate someMethod];
在这里,您可以使用在.h中声明并在.m中合成的公共属性检索您感兴趣的文件夹。
现在,这不是一个好的方法。 AppDelegate类将保持原样。
另一个更优雅的方法是创建一个名为SharedManager
(或其他)的单例,用于存储需要可视化的currentFolder
。
共享管理器看起来像
//.h
@property (nonatomic,strong) Folder* currentFolder;
+ (SharedManager*)sharedInstance;
//.m
@synthesize currentFolder;
+ (SharedManager*)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[SharedManager alloc] init];
});
return sharedInstance;
}
在导入之后,它将用于将文件夹设置为当前文件夹
[[SharedManager sharedInstance] setCurrentFolder:theFolderYouWantToShare];
或检索当前文件夹
Folder* theSharedFolder = [[SharedManager sharedInstance] currentFolder];
P.S。不要滥用单身人士。我使用的单例模式需要iOS 4及更高版本。
修改2
这是我的错。我不明白这个问题。
如果您需要检索所有文件,您只需创建一个NSFetchRequest
,如下所示:
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"File" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDescription];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:request error:&error];
其中results
将包含商店中独立的所有文件。您可以使用此数组来显示表格中的文件。
如果您有很多文件,我真的建议您查看NSFetchedResultsController
课程。它允许延迟加载UITableView
。
您可以在此处找到一个好的教程:How To Use NSFetchedResultsController
编辑3
如何进行提醒?
您应该向您的请求(与NSFetchedResultsController
一起使用的请求)提供类似以下内容的谓词
[request setPredicate:[NSPredicate predicateWithFormat:@"reminder != nil"]];
通过这种方式,您可以检索提醒不是nil
的文件。 reminder
是您在模型中使用的属性。
P.S。检查代码,因为我写的没有Xcode支持。