Сортировка пользовательских ячеек табличного представления в Swift - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над небольшим проектом, где у меня есть приложение, которое принимает информацию tvshow, введенную пользователем, и отображает ее в настраиваемой ячейке tableview. Я хотел бы отсортировать шоу по мере их ввода в зависимости от того, в каком текущем эпизоде ​​находится пользователь. Я знаю, что этот код работает, потому что я тестировал его с помощью операторов печати, и он сортирует массив, но не выполняет сортировку на симуляторе. Поэтому мне просто было любопытно, где я должен разместить это, чтобы оно было отсортировано на стороне приложения.

  func sortShows() {
        let sortedShows = tvShows.sorted { $0.currentEpisode > $1.currentEpisode}
        TVShowTableView.reloadData()
           print(sortedShows)
       }

Вот где я сейчас помещаю его в свой контроллер представления

extension TVShowListViewController: AddTVShowDelegate {
    func tvShowWasCreated(tvShow: TVShow) {
        tvShows.append(tvShow)
        dismiss(animated: true, completion: nil)
        TVShowTableView.reloadData()
        sortShows()
    }
}

1 Ответ

1 голос
/ 27 мая 2020

В этой части вашего кода:

func sortShows() {
    // here you are creating a NEW array
    let sortedShows = tvShows.sorted { $0.currentEpisode > $1.currentEpisode}
    // here you tell the table view to reload with the OLD array
    TVShowTableView.reloadData()
    print(sortedShows)
}

В вашем классе контроллера у вас, вероятно, есть что-то вроде:

var tvShows: [TVShow] = [TVShow]()

, а затем вы заполняете его шоу, как вы с новым шоу:

tvShows.append(tvShow)

Затем ваш контроллер делает что-то вроде:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tvShowCell", for: indexPath) as! TVShowCell
    cell.tvShow = tvShows[indexPath.row]
    return cell
}

Что вы хотите сделать, так это добавить еще одну переменную в свой класс:

var sortedShows: [TVShow] = [TVShow]()

затем измените свое удовольствие от сортировки c, чтобы использовать этот массив:

func sortShows() {
    // use the existing class-level array
    sortedShows = tvShows.sorted { $0.currentEpisode > $1.currentEpisode}
    // here you tell the table view to reload
    TVShowTableView.reloadData()
    print(sortedShows)
}

и измените другие функции, чтобы использовать массив sortedShows:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // use sortedShows array
    return sortedShows.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tvShowCell", for: indexPath) as! TVShowCell
    // use sortedShows array
    cell.tvShow = sortedShows[indexPath.row]
    return cell
}

и вы ' я захочу позвонить по номеру sortShows() в конце viewDidLoad() (или там, где вы получаете исходный список шоу).

Изменить

Другой способ используйте cellForRowAt:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "tvShowCell", for: indexPath) as! TVShowCell

    // use sortedShows array
    let tvShow = sortedShows[indexPath.row]
    cell.showTitleLable.text = tvShow.title
    cell.showDecriptionLable.text = tvShow.description

    return cell
}
...