从集合视图移动到详细视图时如何利用 CoreData

Posted

技术标签:

【中文标题】从集合视图移动到详细视图时如何利用 CoreData【英文标题】:How do I utilize CoreData when moving from collection view to detail view 【发布时间】:2013-05-19 03:03:33 【问题描述】:

我有一个 ios 应用程序,它使用 RestKit 将 json 格式的数据从服务器拉入 CoreData 实体。实体的一些属性有助于使用每个单元格的图像和标题填充集合视图。

当一个单元格被选中时,我试图从集合视图移动到详细视图。 CoreData 实体有一个“摘要”属性,我想在详细视图中与图像一起显示。

我知道我可以通过prepareForSegue 方法传递数据。但是我不确定如何指定要传递的图像和摘要数据

也许传递图像和摘要不是正确的方法?我应该将managedObjectContext 传递给详细视图控制器并从那里获取结果吗?

这是我的 CollectionView 的填充方式。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";

MyNewsCollectionViewCell *cell = (MyNewsCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSURL *photoURL = [NSURL URLWithString:(NSString *) [object valueForKey:@"imageUrl"]];
NSData *photoData = [NSData dataWithContentsOfURL:photoURL];
[cell.cellimg setImage:[[UIImage alloc] initWithData:photoData]];        
[cell.title setText:[object valueForKey:@"title"]];      

return cell;

这里是prepareForSegue 方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"newsDetail"]) 

      NewsDetailViewController *vc =[segue destinationViewController];
      vc.newsDetailImageView = //How do I designate the image from the cell I selected???
      vc.newsDetailText = //How do I designate the text from the cell I selected???             

    

这显然是一个初学者的问题....任何帮助将不胜感激。鉴于我是初学者,基本示例代码真的很有帮助!

【问题讨论】:

【参考方案1】:

如果单元格选择立即触发segue,你可以利用UICollectionViewindexPathForSelectedItems方法获取indexPath,你需要得到你的NSManagedObject

试试这个:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"newsDetail"]) 
        NewsDetailViewController *vc =[segue destinationViewController];
        // In the following line, replace self.collectionView with your UICollectionView
        NSIndexPath *indexPath = [[self.collectionView indexPathsForSelectedItems] objectAtIndex:0];

        NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
        NSURL *photoURL = [NSURL URLWithString:(NSString *)[object valueForKey:@"imageUrl"]];
        NSData *photoData = [NSData dataWithContentsOfURL:photoURL];
        UIImage *img = [[UIImage alloc] initWithData:photoData];

        vc.newsDetailImageView = [[UIImageView alloc] initWithImage:img];
        vc.newsDetailText = howeverYouGetYourObjectSummary;            
    

【讨论】:

谢谢西蒙!这行得通!我还发现 Master-Detail 模板的 prepareForSegue 方法中的代码也可以正常工作。我不知道为什么在我问这个问题之前我没有尝试过!我更感谢您的回答,因为现在我理解了 indexPathForSelectedItems 方法!再次感谢!【参考方案2】:

您可以向您添加属性MyNewsCollectionViewCell,如下所示:

@property (weak,nonatomic) NSManagedObject* myObject;

然后你可以在cellForItemAtIndexPath 中为这个单元格分配这个属性NSManagedObject。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
        /* Add this line to All that u r already doing*/   
        [cell setMyObject:object];
        return cell;
    

现在在didSelectCellMethod,您可以致电[self performSegueWithIdentifier: @"MySegue" sender: cell];

然后在prepareForSegue:从发件人那里得到对象。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(MyNewsCollectionViewCell)sender
            
                if ([[segue identifier] isEqualToString:@"newsDetail"]) 
                    NewsDetailViewController *vc =[segue destinationViewController];
                    NSManagedObject* object = sender.myObject;

                    //use this object to set values of 

                    vc.newsDetailImageView = /*set value*/
                    vc.newsDetailText = /*set value*/            
                
        

【讨论】:

伊拉,感谢您的回复。我能够让我的代码在 Simons 上首先回答,但我相信查看你的代码我也可以这样做。我还没有证明这一点,但它似乎是合乎逻辑的并且是该问题的可靠解决方案。谢谢!

以上是关于从集合视图移动到详细视图时如何利用 CoreData的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用 swift 5 的动态集合视图从一个视图控制器移动到另一个视图控制器?

集合视图到详细视图

无法将数据从集合视图传递到 Xcode 中的详细视图

将信息从一个集合视图传递到另一个更详细的集合视图的最佳方法是啥

如何将集合视图上选择的所有单元格列出到另一个视图中

核心数据:移动到详细视图时获取崩溃