ios UITableView 与 fetchedresultscontroller - 添加自定义行

Posted

技术标签:

【中文标题】ios UITableView 与 fetchedresultscontroller - 添加自定义行【英文标题】:ios UITableView with fetchedresultscontroller - add custom rows 【发布时间】:2014-07-28 06:35:41 【问题描述】:

我有一个UITableView,其中的数据来自NSFetchedResultsController

这是我的 tablewView:

我需要添加一行“所有类型”。它还需要:

    可与所有其他物品分类 可选(现已选择设计) 选择“所有类型”应取消选择其他行 在选中时提供一些内容以了解它是“所有类型”行

我读过Add extra row to a UITableView managed by NSFetchedResultsController 和NSFetchedResultsController prepend a row or section。给定的方法无法对数据进行排序,或者看起来很老套,并产生了太多难以维护的代码,以至于无法更改逻辑和维护代码。

还有其他好的选择吗?

PS。我理解,我的问题可能听起来“宽泛”并且不包含代码,但我认为这是非常常见的问题。

【问题讨论】:

【参考方案1】:

我认为这根本不是一个非常普遍的问题。我可以看到做您正在尝试的事情似乎很自然,但让我们分析您的情况:您通常拥有的是 2 个对象数组,您希望将它们排序为单个数组。现在这是很常见的情况,我相信每个人都知道如何解决这个问题。您需要创建一个对象数组,然后对其进行排序。

在我看来,你有 3 个选择:

获取所有项目,合并 2 个数组,排序并呈现它们。这不是一个好主意,因为如果数据库中有很多项目,您的内存消耗可能会有点过大。 将额外的数据放入数据库并像往常一样使用获取结果控制器。这应该很好用,但您可能需要标记这些项目,以便以后将其删除或将其保留在数据库中,但在您不想显示它们的地方忽略它们。 结合需要从数据库中获取的内容和您的其他数据创建一个临时数据库。如果您的数据在此列表中是只读的(实际上您发布的内容似乎就是这种情况),则此方法非常有用。仍然最好在对象之间创建某种链接。例如,某种 ID 会很棒,这样当用户从第二个数据库中选择一个对象时,您只需读取 ID 并从原始数据库中获取该对象。

【讨论】:

我没有两个数组。我只需要在我的 tableView 中添加一行 那我看不出问题出在哪里。您只需使用委托方法来添加额外的行。您可以在加载时获取单元格的位置,并在此位置之后偏移所有对象。或者,您可以通过将请求的单元格数据与自定义单元格数据进行比较来动态应用插入,如果请求的数据大于自定义单元格数据,则偏移它们。 其实有问题。我的 tableView 有一些自定义逻辑(例如,选择“所有类型”应该取消选择其他行)。如果您的方法我必须将委托设置为我的控制器并使用该自定义逻辑实现 didSelectRowForIndexPath 。实际上,外部控制器不需要知道这个逻辑。如果我有 3 个这样的表(在不同的控制器中)会发生什么?我必须复制粘贴所有代码或进行一些奇怪的重构 你不需要多次编写这个逻辑。表视图有委托和数据源。所以 didSelectRowForIndexPath 由委托拥有,而单元格插入由数据源控制。这意味着您可能对多个委托拥有相同的数据源,或者相反。顺便说一句,如果您的选择非常自定义,您可能希望在单元格中使用按钮并编写自己的逻辑.. 我明白,你在说什么。实际上,我现在有单个数据源对象为所有 tableViews 播种(当然,使用不同的数据)。但是我需要在不同的 tableview 代表中执行不同的操作。所以我需要一个委托来委托:) 内部委托将处理选择,而外部委托(每个单元格 1 个)将处理触摸并执行所需的操作。我认为这是一个复杂的结构,我一直在寻找一种更简单的方法来解决它

以上是关于ios UITableView 与 fetchedresultscontroller - 添加自定义行的主要内容,如果未能解决你的问题,请参考以下文章

firebaseui-ios FirebaseTableViewDataSource 与 UITableView 同步

IOS下拉与UITextField和UITableView

UITableView 在 IOS 7 与 IOS 6 中的行为不同

iOS UITableView 与 UIPickerView

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

当 Scroll UITableView 它与名称 iOS 重叠