在UITableView中查看多个部分,每个部分包含从单个数组中过滤的对象

时间:2015-02-22 08:56:02

标签: iphone arrays uitableview swift segue

我是一个初学者,显然不在我的联盟中,我也无法在网上找到答案。

我有一个UITableViewControllerUITableView显示存储在一个数组中的自定义对象。我没有在所述TableView的单个部分中显示数组的所有对象: TableView有多个部分,每个部分包含我的对象数组的过滤部分(我过滤自定义对象数组检查对象类别属性是否等于我在类别数组中指定的类别。

这个过滤并在不同部分显示单个数组工作正常(我知道也许它不优雅,因为我说我是编码和我绝对需要使用一个单独的数组,而不创建与过滤结果相对应的其他数组),但为了更好地理解我的问题,我认为我展示我所做的更好,所以这里&# 39;是我的代码的TableView部分:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return myCategoriesArray.count
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        for (var i = 0; i <= section; i++){
            if section == i {
                for eachCategory in myCategoriesArray {
                    return myObjectsArray!.filter() { $0.objectCategoryProperty == myCategoriesArray[i] }.count
                }
            }
        }
    // ...
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {   
        var cell = tableView.dequeueReusableCellWithIdentifier("objectCell", forIndexPath: indexPath) as UITableViewCell
        for (var i = 0; i <= indexPath.section; i++){
            if indexPath.section == i {
                for eachCategory in myCategoriesArray {
                    cell.textLabel?.text = myObjectsArray!.filter() { $0.objectCategoryProperty == myCategoriesArray[i] }[indexPath.row].nameProperty
                    return cell
                }
            }
        }
    // ...
}

这是因为我有UITableViewController显示我的所有对象,但按类别分隔过滤。

当我选择一个单元格并显示详细视图时,我的问题是使用segue。

这是我的prepareForSegue方法:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        var nextVC = segue.destinationViewController as MyNextViewController
        if let indexPath = tableView.indexPathForSelectedRow() {
            let selected = myObjectsArray![indexPath.row]
            nextVC.passedObject = selected
        }
    }
}

我确定你们很多人已经看到了我的问题:我使用as index [indexPath.row]在自定义对象数组中选择了传递给下一个ViewController的对象,但是indexPath.row每个部分从0开始,所以当我选择一个对象时,它在TableView中的索引不等于自定义对象数组中的索引,这意味着我传递了错误的对象。

现在,我被卡住了,因为我没有看到将右(意思是,选定的)对象传递给下一个视图控制器的方法,而保留了我工作的事实只有一个数组

我想到将objectIDString属性添加到每个对象的想法和每次选择单元格时设置的单个var currentSelectedObjectIDS字符串,并尝试将objectIDString属性与currentSelectedObjectIDString匹配的对象传递给下一个View Controller,但对于我没有经验的眼睛来说,这看起来不是一个坏主意,而且即使我想(也许实施didSelectRowAtIndexPath:,但我无法使其成功),我实际上也不确定如何实现这一目标。

任何帮助都会非常感激,我已经坚持了这么久我开始质疑a)我的理智b)我在项目中做出的每一个决定(意思是,所有对象的单个数组)这部分是过滤的,但我已经投入了很多,我真的不想重新开始。

谢谢,

切萨雷

P.S。我希望我的问题很明确,英语不是我的主要语言......对不起任何错误!

2 个答案:

答案 0 :(得分:1)

我建议您使用 NSFetchedResultsController 。此类具有属性 sectionNameKeyPath 。在这个属性中你可以设置你的类别,你不需要在每个numberOfSection和numberOfRows中重复迭代。

像这样:

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "event.startDate", cacheName: nil)

在我的情况下,我需要通过event.startDate过滤数据。

我不知道您是否使用核心数据,但如果您正在使用,则这是更好的方法。

我会为你揭露它们! 在NSFetchedResultsController的第一时刻就像复杂,但它非常非常有用。不要害怕。

我不确切知道您的模型和数据。在这种情况下,我会向您展示我的所有者样本。

请在以下链接中查看我的问题: Sectioning TableView and rows with Core Data Swift

在此链接中,请参阅我的问题,在底部,我将与其他人解答完整的解决方案。

如果您不清楚,请与我联系:。)

答案 1 :(得分:0)

我花了一整天的时间试图找到解决上述问题的方法,我想我终于找到了一个工作方法。 我的前提和免责声明是,这是一堆黑客,我发布这个只是为了以后这可以帮助我的情况在未来,但显然处理这种情况的方式是核心数据,如Weles&#建议39;回答,而不是我做了什么。

简要介绍了我为获取多组件UITableView所做的工作,其中所有数据都来自单个自定义对象数组,这些自定义对象由每个组件中的不同值过滤,以通过选择单元格时,所选对象到详细视图。

1)我在所有customObjects中添加了一个objectID:String计算属性(当前日期+随机数)。

2)我添加了一个var currentSelectedObjectID:String?在我的TableViewController中。

3)我将UITableViewCell子类化,创建了一个CustomTableViewCell类,它只将var selectedCellID:String?添加到普通类中,然后我更改了cellForRowAtIndexPath以返回CustomTableViewCell而不是{{1 }}。在此方法中,在返回单元格之前,我还将单元格的selectedCellID属性设置为等于当前对象的objectID。我还必须将Storyboard中的单元格类从UITableViewCell更改为CustomTableViewCell。

4)在故事板中,我将segue从单元格移到了由Xcode自动创建的detailViewController,并将自定义StoryboardID设置为detailViewController(&#34; detailVC&#34;),

5)在TableViewController的UITableViewCell内,我在didSelectRowAtIndexPath尝试之前完成了所有工作,但是以不同的方式(不是segue,prepareForSegue)。这是代码:

self.navigationController?.pushViewController

我认为一个体面的程序员(我不是一个人,但我希望有一天能成为一个人)很有可能,看到我做了什么,可能会晕倒。 同样,我不认为任何人应该这样做,如果你在同样的情况下直接进入核心数据:我花了一天时间在这上面,很有可能在三四个我可能有核心数据工作。 但是,由于这是黑客和低效的,它可以工作......我测试了多次。所以,花了这么多时间,并且在网上找不到有用的类似的先前答案,我想发布我的。

不要这样做,我真的害怕这很容易破碎! :)

我仍然期待其他答案,从我的众多错误中吸取教训!