Вставка ячейки в заданный раздел c - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь найти способ, который позволил бы мне вставить новую ячейку в указанный раздел c в моем табличном представлении. Есть кнопка, которая называется «добавить песню», и как только пользователь нажимает на нее, он должен вставить новую ячейку, созданную с ячейкой-прототипом. Эта ячейка прототипа позволит пользователю щелкнуть по ней и редактировать определенную информацию в этой ячейке. Я пытался кодировать способ вставить ячейку ниже ячейки, которая в настоящее время находится в этом разделе, который является разделом «3». Я уверен, что это что-то простое, что я испортил, так как я не очень привык делать просмотр таблиц. Вот мой код:

import UIKit

class MultipleSongsTableViewController: UITableViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func addSong(_ sender: Any) {
        insertNewSongCell()
    }

    func insertNewSongCell() {
        let indexPath = IndexPath(row: -1, section: 3)

        tableView.beginUpdates()
        tableView.insertRows(at: [indexPath], with: .automatic)
        tableView.endUpdates()
    }
}

extension MultipleSongsTableViewController {


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 5
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return 1
        } else if section == 1 {
            return 1
        } else if section == 2 {
            return 1
        } else if section == 3 {
            return 1
        } else {
            return 1
        }
       }

       override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "trackTitleCell", for: indexPath) as! ReleaseTitleTableViewCell


                     return cell
        } else if indexPath.section == 1 {

            let cell = tableView.dequeueReusableCell(withIdentifier: "genreCell", for: indexPath) as! Genre2TableViewCell

            return cell
        } else if indexPath.section == 2 {

            let cell = tableView.dequeueReusableCell(withIdentifier: "TrackListCell", for: indexPath) as! TrackListTableViewCell

            return cell
        } else if indexPath.section == 3 {

            let cell = tableView.dequeueReusableCell(withIdentifier: "TrackListSongCells", for: indexPath) as! TrackListSongsTableViewCell


            return cell
        } else {

            let cell = tableView.dequeueReusableCell(withIdentifier: "AddSongButtonCell", for: indexPath) as! AddSongTableViewCell

            return cell
        }
    }
}

Также здесь приведен скриншот того, как выглядит мой viewcontroller и где я ожидаю заполнение новой ячейки. Simulator Screen Shot

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

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Прежде всего вам необходим массив источника данных для раздела, например

var songs = [String]()

Затем вам нужно изменить numberOfRowsInSection, чтобы он возвращал количество песен для раздела 3. Этот способ может быть упрощен в любом случае

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
        case 3: return songs.count
        default: return 1
    }
}

Теперь вы можете добавить новую песню в массив и вставить строку

func insertNewSongCell() {
    let insertionIndex = songs.count
    songs.append("New Song")
    let indexPath = IndexPath(row: insertionIndex, section: 3)
    tableView.insertRows(at: [indexPath], with: .automatic)
}

beginUpdates и endUpdates не действуют в этом случае, вы можете опустить линии.

1 голос
/ 13 февраля 2020

Вызов UITableView.insertRows (at: with:) вставит ячейки в ваш UITableView. Вы можете вставить ровно 1 ячейку, передав аргумент indexPaths, содержащий 1 IndexPath:

self.tableView.insertRows(at: [IndexPath(row: 1, section: 3)], with: .automatic)

Возможно, вам также потребуется обновить UITableViewDataSource, чтобы он возвращал ожидаемые значения, например, из его tableView (_: numberOfRowsInSection:) , чтобы учесть дополнительные строки. В противном случае ваше приложение сгенерирует необработанное исключение и вызовет sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...