【问题标题】:Swift combine different type into one array to display data for UITableViewSwift 将不同类型组合成一个数组来显示 UITableView 的数据
【发布时间】:2019-07-11 06:05:43
【问题描述】:

我有表格视图,我需要在其中显示几个部分。你应该把这张表想象成你的歌曲的播放列表。在顶部的第一部分中,我需要显示一个带有按钮的单元格,它将向播放列表添加更多歌曲,而 tableview 的其他部分是音乐类别的标题标题(如流行、摇滚等)。这些部分中的每一个都包含作为歌曲名称的单元格。

我有一系列这样的歌曲:var songsGroups = [SongGroup]。这实际上是我的数据源。

SongGroup 包含几个属性:

var categoryName: String
var songs: [Songs]

但问题出现在下一个级别。我每次都需要检查 indexPath.section 并这样做:

if indexPath.section == 0 {
// this is a section for ADD NEW SONG BUTTON cell no need in header title as there is no data repression only static text on the cell.
} else {
var musicCategoryName = songsGroups[indexPath.seciton - 1]. categoryName
headerTitle.title = musicCategoryName
}

正如你所见,我的代码通过添加这个很酷的-1 神奇数字变得神奇。我重播一点也不喜欢。

作为一个想法,我可以尝试将我的 ADD NEW SONG BUTTON 部分(通过添加一些额外的对象)与songsGroups 数组结合起来,并为此创建 NSArray。正如你所记得的,就像在 Objective-C 中一样。那么我的数据源数组将如下所示:

some NSArray = ["empty data for first cell", songsGroups[0], songsGroups[1]... etc]

因此,无需检查任何我们可以信任我们的数组来构建所有内容的部分,即使我将添加更多空数据单元格,我也无需通过 if 块处理我的代码并添加大量神奇数字.

但我在这里看到的问题是我们不使用显式类型的数组,这很令人不安。

所以也许你知道如何解决我的问题的更漂亮的解决方案。

【问题讨论】:

  • 退后一步,必须按钮在表格单元格中吗?为什么不把它放在标题、导航栏或单独的视图中?
  • @JoshCaswell 是的,这是一个有效的评论,但我想这仅适用于我们为某些带有静态文本的 UI 控件使用顶部单元格或顶部部分的情况,以防系统的灵活性和理论上,我们可以将一些带有静态文本的空数据单元格放在任何索引中,而不仅仅是在整个屏幕的顶部或底部。所以灵活性对我来说也很重要。但感谢您的评论!

标签: ios arrays swift uitableview nsarray


【解决方案1】:

我不确定我是否理解正确。但在我看来,你想显示

1) 允许用户通过点击按钮添加新歌曲的功能,以及
2) 一张歌曲表,分成几组。

如果是这种情况,为什么不把添加新歌按钮放在table header view 中,并将所有歌曲组和歌曲放在一个二维数组中用作数据源?

【讨论】:

  • 我猜@pckill 提供了一个漂亮的解决方案,而且它更灵活,因为我们不需要记住对象是如何组织的。我们只有一个对象列表,其中一些具有静态数据或提供的空案例类型,而某些具有动态数据的对象作为歌曲列表可能会有所不同(无论您添加到播放列表中的内容是否正确)。但也感谢您的回答
【解决方案2】:

你可以引入一个辅助枚举:

enum Section {
    case empty
    case songCategory(categoryName: String, songs: [String])
}

您的数据源将如下所示:

let datasource: [Section] = [.empty, .songCategory(categoryName: "Category1", songs: ["Song 1", "Song2"])]

所以现在你可以使用pattern matching 来填充表格视图:

let section = datasource[indexPath.section]
if case let .songCategory(categoryName, songs) = section {
    headerTitle.title = categoryName
} else {
    // this is a section for ADD NEW SONG BUTTON cell no need in header title as there is no data repression only static text on the cell.
}

【讨论】:

  • 是的,这是一个很好的解决方案!谢谢。一个问题是有很多参数,而不仅仅是类别名称或歌曲数组,我们可以使用特定类型吗?我的意思是只保留一些歌曲类别(类别:类别对象)
  • @MatrosovAlexander,是的,当然。
  • 另外,如果我选择了一些带有歌曲的单元格并想要显示复选标记,如何在运行时修改 let 数据源?我的意思是我只需要像我理解的那样用新的替换索引处的数据源
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多