Swift объединяет разные типы в один массив для отображения данных для UITableView - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть таблица, где мне нужно показать несколько разделов.Вы должны представить этот стол как список воспроизведения ваших песен.В верхнем первом разделе мне нужно отобразить ячейку с кнопкой, которая добавит больше песен в список воспроизведения, а другие разделы табличного представления - это заголовки заголовков категории Музыка (например, поп, рок и т. Д.).Каждый из этих разделов содержит ячейки, которые являются названиями песен.

У меня есть массив песен, который называется так: 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 и добавить тонны магических чисел.

Но проблема, которую я вижу здесь, заключается в том, что мы не используем явные типы массивов, и это расстроено.

Такможет быть, вы знаете более красивые решения, как решить мою проблему.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Я не уверен, правильно ли я вас понял.Но мне кажется, что вы хотите отобразить

1) что-то, что позволяет пользователю добавлять новую песню, нажав кнопку, и
2) таблицу песен, разбитую на группы.

Если это так, почему бы вам не поместить кнопку добавления новой песни в представление заголовка таблицы , а все ваши группы песен и песни в 2-мерном массиве использовать в качестве источника данных?

0 голосов
/ 17 февраля 2019

Вы можете ввести вспомогательное перечисление:

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

Ваш источник данных будет выглядеть примерно так:

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

Так что теперь вы можете использовать сопоставление с образцом для заполнения таблицы просмотра:

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.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...