动态地将自定义对象数组分类为UITableview

时间:2015-05-15 16:45:06

标签: uitableview swift

我有一个问题,困扰我几天了。

我有一个名为countries的数组。此数组包含一个自定义对象,用于保存国家,城市,IP,状态等数据。

我需要在属性" country"中划分的tableview中显示这些对象。

这意味着,如果我有两个自定义对象,包括国家"澳大利亚"我需要将它添加到名为" Australia"如果我有5个对象与国家"西班牙"我需要这5个对象在西班牙部分。

我需要找到一种方法来确保即使某个对象添加了不同的国家/地区,也会将其放在带有国家/地区名称国家/地区名称的部分下。

我尝试过各种各样的事情但是没有任何事情能够解决这个问题。 这是动态的原因是因为我不知道每个部分中将有多少个对象。这意味着每个部分中的对象数量可以更改。

我使用此代码按字母顺序对数组进行排序我只需要根据属性" Country"将每个对象放入一个部分。我不知道将会有多少部分或每个部分中有多少个对象。

self.countries = self.countries.sorted { $0.country < $1.country }

有人能帮我一把吗?

编辑:添加了我的cellForRowAtIndexPath。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if recievedData == true {
        var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CountryListCell
        var serverInfo = countries[indexPath.row] as ServerInfoObject
        cell.countryTitle.text = serverInfo.country
        cell.flagImage.image = UIImage(named: serverInfo.flag)
        cell.serverInfo = serverInfo

        return cell
    }

    return CountryListCell()

}

3 个答案:

答案 0 :(得分:2)

因此您需要将服务器排序为字典。 E.G [String:[Server]]字符串是部分名称(国家/地区)。这是一个例子dict ["Albania":[serv1,server2,...]]

您可以通过对服务器阵列进行排序来完成此操作(我假设您可以解决这个问题)。

您还需要保存部分标题的数组,以便在cellForRowAtIndexPath中访问它。例如["Albania","Brazil","Cuba","Germany","Russia"]

所以基本上在cellForRowAtIndexPath中使用

访问当前国家/地区时
var country = yourSectionArray[indexPath.section]

然后通过字典访问对该国家有效的服务器数组,如下所示:

var serversOfCurrentSection = yourDictionary[country] as [Server]

然后获取索引的当前服务器

var server = serversOfCurrentSection[indexPath.row]

获取每个部分中的对象数量:

var country = yourSectionArray[indexPath.section]
yourDictionary[country].count

答案 1 :(得分:0)

您是否尝试使用NSPredicate来帮助您按国家/地区名称过滤数组?我认为您可以在运行时或加载开始时将服务器拆分为数组,具体取决于列表是否更新。

numberOfRowsInSection:中,只需计算索引部分的子数组的行数。

同样,在cellForRowAtIndexPath:中,使用已排序的数组从自定义类中获取信息。

我不得不处理与排序联系人类似的事情。希望这有帮助!

答案 2 :(得分:0)

有很多方法可以做到这一点。

表视图需要稳定的数据才能工作。如果更改数据模型,则需要告知表视图重新加载。

我可能会以两种方式存储记录:在一个平面数组中,然后在一个数组中按国家/地区排列,其中该数组中的每个条目都是该国家/地区的记录数组。像数组这样的集合对象通过引用将对象保存在其中,因此在多个数组中存储相同的记录时没有太多开销。

这使得创建分段表视图非常干净。

您可以按国家/地区对您的平面记录数组进行排序,然后对已排序的数组进行传递,按国家/地区构建记录数组。如果您需要按国家/地区内的某些其他条件排序记录,则可能需要使用NSPredicate进行排序而不是排序,因为它可以使用排序键数组。

如果用户可以在任何地点输入新记录,您可以收集该新记录的数据,然后在排序的数组中找到它所在的位置,将其插入该位置,然后重建您的二维数组排序的平面数组中的数组。这样可以避免对整个数组进行重新排序,这对于大型数据阵列来说可能很慢。)