将 Core Data 与图像或按钮(或除了 tableView 之外的任何东西)一起使用

Posted

技术标签:

【中文标题】将 Core Data 与图像或按钮(或除了 tableView 之外的任何东西)一起使用【英文标题】:Using Core Data with Images or buttons (or anything besides a tableView) 【发布时间】:2011-12-06 21:45:01 【问题描述】:

我正在尝试构建一个使用类似于以下数据模型的应用程序。我可以在 tableView 中做到这一点,但我想更有创意。例如,在导航控制器中,我想要一个包含 10 个图像(或以图像为背景的按钮)的视图。

(三个实体)

实体 1:房子

属性:houseName 关系:人

实体 2:人

属性:personName 关系:房子 关系:孩子

实体 3:儿童

属性:名称 属性:出生地 关系:成人

关系是一对多的关系 属性都是字符串

人>房子,孩子>成人

在第一个视图中有图像,每个图像都分配给实体 House(houseName 1、houseName 2 等)。当您选择房子时,它会推送带有 5 张图像的下一个视图(链接到 Person 实体(personName 1、personName2 等)。当您选择 PersonName 时,它​​将推送下一个填充有 Children Entity 的视图。

我已经阅读了很多关于核心数据的信息,我很乐意这样做:

NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [[managedObject valueForKey@"houseName"] description];

但非常不确定我什至应该从哪里开始使用和图像或按钮来执行此操作

我在想这样的事情:

-(id)initWithHouseViewController:(HouseViewController*)aHouseViewController house:(NSManagedObject *)aHouse
if blah blah
self.houseViewController = aHouseViewController;
self.house = aHouse
  return self;

// 选择器

 -(void) showPersonView
PersonViewController *pvc = [[PersonViewController alloc] initWithHouseViewController:self house:house];

在viewDidLoad中


if (house != nil) 
UIImageView *house1 = [[ UIImageView alloc.. blah blah
some kind of..  action:@selector(showPersonView)
((for each houseName in house) instead of house1, house2,)
...

我不需要在每个图像(或按钮)中硬编码的 viewDidLoad 的任何建议都会很好地使它更便携。此外,如果有人建议以更好/更有创意的方式来做这件事,我不会这样做。

对不起,如果这有点混乱。在我的脑海里也很混乱。

感谢您抽出宝贵时间阅读本文,

【问题讨论】:

【参考方案1】:

在这种情况下我不会使用 FetchResultController。

你可以试试这个:

创建一个将所有房屋显示为按钮的视图控制器,您可以根据“房屋”计数动态创建按钮。 它看起来像这样:

 NSArray * allHouses = [Houses allObjects];
 //you can sort them if you need

[allHouses enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 


    //create the buttons as custom and you can add any image to the button
    UIButton *button....
    button
   //store the house index as the button tag, so you can get it later
    button.tag = idx;
  //add a selector to the button
   [button addTarget:self
                     action:@selector(getPersons:)
           forControlEvents:UIControlEventTouchUpInside]; 
];

创建一个新的 PersonViewController 来容纳这些人员。视图控制器应该将房子作为参数而不是人。得到房子后,你会得到有关系的人。

现在添加这个方法来获取:

  -(void)getPersons(UIButton*)sender
        NSInteger *tag = sender.tag;
         House * house = (House*)[allHouses objectAtIndex:tag];

        PersonViewController *pvc = [[PersonViewController alloc] init];
          pvc.house = house;
         [self.navigationController pushViewController.....];

在人员视图控制器中,您可以获取所有人员或使用获取请求或简单地使用:

         NSArray *allPersons = [house.person all objects];

再次像使用第一个视图控制器一样创建人员按钮。

用 Children 视图控制器重复相同的过程。

祝你好运

沙尼

【讨论】:

感谢 Shani,我不知道如何从 aHouse 到 table view 之外的 Houses 计数。我确定我只是错过了一些简单的东西,但挫败感已经出现了。 你能再解释一下你的问题吗?我不确定我做对了。 所以你是说我应该为每个 NSMO 继承 NSManagedObject #import 然后 NSArray *allHouses = [Houses allObjects] 对吗? 我也很乐意用非动态的方式来做这件事,因为我不能这样做 您好,请问您看不懂的id是什么?

以上是关于将 Core Data 与图像或按钮(或除了 tableView 之外的任何东西)一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Core Data iCloud 同步图像

ios Core Data - 我的保存按钮不起作用

如何调整 Core Data 默认缓存的行为或大小?

在 NSAttributedString 中添加图像并保存到 Core Data 性能

Image Wells、Core Data 和 Sqlite 文件

iOS NSArray, NSSet 与 Core Data Query (Fetch Request)