Ios 跨多个UITableViewCell拆分单个核心数据对象

Ios 跨多个UITableViewCell拆分单个核心数据对象,ios,objective-c,uitableview,core-data,Ios,Objective C,Uitableview,Core Data,我有一个名为Drug的核心数据对象,它包含4个属性;drugEnabled、drugName、drugAdmin、drugExpire 核心数据对象是通过解析JSON文件预先填充的,因此单个条目可能如下所示;“drugName”:“Drug1”,“drugEnabled”:true,“drugAdmin”:“1/1/90”,“drugExpire”:“1/1/00” 单节表有3个原型单元格。第一个用于药物名称,还包含一个开关,用于隐藏或显示以下两个单元格,分别用于drugAdmin和drugEx

我有一个名为Drug的核心数据对象,它包含4个属性;drugEnabled、drugName、drugAdmin、drugExpire

核心数据对象是通过解析JSON文件预先填充的,因此单个条目可能如下所示;“drugName”:“Drug1”,“drugEnabled”:true,“drugAdmin”:“1/1/90”,“drugExpire”:“1/1/00”

单节表有3个原型单元格。第一个用于药物名称,还包含一个开关,用于隐藏或显示以下两个单元格,分别用于drugAdmin和drugExpire。前提是只有启用(打开)的药物将显示其各自的管理日期和过期日期。所有禁用的drugName单元格将在下方显示,但不显示任何相应的日期。我可以用以下方式以文本形式表示:

- Drug 1 (on)
- - Drug 1 Admin Date
- - Drug 1 Expire Date
- Drug 2 (on)
- - Drug 2 Admin Date
- - Drug 2 Expire Date
- Drug 3 (off)
- Drug 4 (off)
- Drug 5 (on)
- - Drug 5 Admin Date
- - Drug 5 Expire Date
因为我没有使用任何节,并且因为每个对象分布在表中的3个不同行上,所以我修改了numberOfRowsInSection,以便将返回的fetchedResultsController.FetchedObject计数乘以3,即

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [self.fetchedResultsController.fetchedObjects count] * 3;
}
然后我使用cellforrowatinexpath方法来确定哪些内容属于哪个单元格,即

- (DrugTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    Drug *drug = [self.fetchedResultsController objectAtIndexPath:indexPath];

    if (indexPath.row % 3 == 0) {
    static NSString *cellIdentifier = @"cellDrug”;
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        cell.drugName.text = drug.drugName;     
        return cell;
    }

    else if (indexPath.row % 3 == 1) {
    static NSString *cellIdentifier = @"cellAdmin";
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        cell.drugAdmin.text = drug.drugAdmin;       
        return cell;
    }

    else if (indexPath.row % 3 == 2) {
    static NSString *cellIdentifier = @"cellExpire";
    DrugTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        cell.drugExpire.text = drug.drugExpire;     
        return cell;
    }

    else {
        // never returned
        return cell;
    }
}
为了完整起见,我还使用以下设置了单元格高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row % 3 == 0) {
        return 48;
    }

    else if (indexPath.row % 3 == 1) {
        return 38;
    }

    else if (indexPath.row % 3 == 2) {
        return 38;
    }

    else {
        return 100;
    }
}
我遇到的错误是,在cellForRowAtIndexPath方法中(尽我所能确定),核心数据返回的对象数与我的UITableView中的行数不匹配。实际上,我获取了5个核心数据对象,并将它们拆分为15个不同的UITableViewCell。具体取决于我实例化的时间对于我的药物对象,我要么得到
[\u PFArray objectAtIndex::]:索引(5)超出界限(5)
,要么在索引0的第6节中得到
没有对象作为我的错误。我理解错误,但我不知道如何解决它


同样,这个表背后的主要前提是能够通过一个开关隐藏和显示相关行,并在一个分区表中进行。我还没有找到任何例子来澄清这一点,我认为我非常接近,但这个错误让我感到紧张。有人看过关于显示单个分区的好教程/建议吗使用户可以根据不同的条件隐藏和显示行吗?

在调用之前,您需要修复indexPath.row(因为您返回的是count*3)

Drug *drug = [self.fetchedResultsController objectAtIndexPath:indexPath]
因此,您将需要创建一个新的indexPath,它与

NSIndexPath *adjustedIndexPath = [NSIndexPath indexPathForRow:indexPath.row / 3 inSection:indexPath.section];
Drug *drug = [self.fetchedResultsController objectAtIndexPath:adjustedIndexPath];

如果某些单元格将打开(导致多出一个单元格),而其他单元格将关闭(导致多出三个单元格),则索引路径的计算将非常复杂。仅使用
indexath.row中的模3将无法将其剪切

另一种解决方案可能是将三个单元格合并为一个。您只需要两种单元格类型,“闭合”和“扩展”。这样您就不必再考虑
NSFetchedResultsController
的索引路径算法了


无论如何,您都需要跟踪哪些单元格处于打开状态,哪些单元格处于展开状态。您只需要在两个位置进行说明,
cellforrowatinexpath
heightforrowatinexpath

问题是:Drug*Drug=[self.fetchedResultsController objectAtIndexPath:indexPath];当您必须在3天后才能获得新药时,您获得了另一种药物。根据您的描述,代码中的编号假设似乎是错误的。如果所有5个对象均为“开”,则5个对象仅转换为15行,同样,如果任何条目为“关”,则
%3
也不起作用例如,在你的文本表示中,你有5种药物,但只有11行。Tom,你是正确的,如果5个条目中的任何一个“关闭”,那么你将不再有15行(3x5),这是我试图绞尽脑汁解决的挑战的一部分。Mundi有一个很好的建议,将细胞合并为“闭合”和“扩展”,但我不确定这是否会改变代码面临的大部分挑战。我认为另一种选择是根本不隐藏它们,而是简单地禁用它们,或者将它们的内容更改为类似“n/a”的内容当后端有5个对象时,正好有5个单元格将显著改变代码的挑战。因为基本上没有更多的挑战了。你只需要保存在数组中展开的药物的所有索引。或者你也可以将该状态放入核心数据中。Taylor,你的adjustedIndexPath前提似乎不是o完美地完成这个把戏,尽管Mundi对其日益复杂的问题提出了非常好的观点。非常感谢你们两位的快速反应,为我指明了正确的方向。Mundi,Taylor提供的洞察力似乎完成了这个把戏,尽管你对其日益复杂的问题提出了非常好的观点。我仍然没有解决隐藏和隐藏的问题由于行的问题以及与之相关的核心数据更新。因此,我们将看到这个概念有多疯狂。感谢您的快速响应。只有在所有行都“打开”的情况下,Tylors公式才会起作用。这不是您想要的。