Динамическое табличное представление в ячейке статического табличного представления - PullRequest
0 голосов
/ 24 июня 2018

Я довольно новичок в программировании Swift и сейчас я реализую динамическое табличное представление в ячейке статического табличного представления. Я знаю, что уже есть множество решений для stackoverflow, но я понял, что большинство из них находятся в Obj-C, но я пока не очень знаком с ним.

По сути, у меня есть TableView, который установлен как динамический в одной из ячеек статического табличного представления, которая является частью основного контроллера табличного представления. Проблема, с которой я столкнулся сейчас, заключается в том, что, похоже, нет способа реализовать функции источника данных, не объявив их для статического табличного представления. Я объявил @IBOutlet для динамической таблицы (в этом сценарии назовем ее dynamicTableView).

Мне удалось заставить override func numberOfSections(in tableView: UITableView) работать, вернув 1, если tableView не dynamicTableView, как в следующем коде:

override func numberOfSections(in tableView: UITableView) -> Int {
        if tableView == dynamicTableView {
            return data.count
        }
        else {
            return 1
        }
    }

Однако проблема, с которой я сейчас сталкиваюсь, заключается в реализации override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath). Я понятия не имею, что будет возвращено, если параметр tableView не dynamicTableView, но для статического табличного представления.

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if tableView == dynamicTableView {
            let cell = tableView.dequeueReusableCell(withIdentifier: "dynamic", for: indexPath) as! dynamicTableViewCell

            cell.update(data[indexPath.row]) // A helper function declared in the dynamicTableViewCell.swift

            return cell
        }
        else {
            // What to return here?
        }
    }

Спасибо!

Редактировать: Я имел в виду, что у меня не может быть cellForRowAt функция источника данных, которая не влияет на мое статическое табличное представление.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Если ячейки статического представления таблицы довольно различны, они могут быть индивидуально разделены на подклассы. Динамическое представление таблицы / коллекции может быть добавлено в необходимый подкласс ячейки статического представления таблицы.

// класс для статического просмотра таблицы

 let reviewCellId = "reviewCell"

    class StaticTableClass: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        //register static cell classes
        tableView.register(ReviewCell.self, forCellReuseIdentifier: reviewCellId)
        //..

    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: reviewCellId, for: indexPath)

        return cell
    }
  }

Создайте отдельный класс ReviewCell, который будет содержать динамический UITableView следующим образом.

Таким образом, один класс будет обрабатывать методы только одного табличного представления.

 class ReviewCell: UITableViewCell, UITableViewDelegate, UITableViewDataSource {

        lazy var dynamicTableView: UITableView = {
            let tv = UITableView()
            tv.delegate = self
            tv.dataSource = self
        }()

        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)

            setupViews()
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        func setupViews() {
            addSubview(dynamicTableView)

            dynamicTableView.register(UITableViewCell.self, forCellReuseIdentifier: "dynamicCellId")
        }

        // add further tableview methods in here
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        }
}
0 голосов
/ 24 июня 2018

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if tableView == bloggerReviewTableView {
            let cell = tableView.dequeueReusableCell(withIdentifier: "dynamic", for: indexPath) as! dynamicTableViewCell

            cell.update(data[indexPath.row]) // A helper function declared in the dynamicTableViewCell.swift

            return cell
        }
        else {
            // What to return here?
               let cell = tableView.dequeueReusableCell(withIdentifier: "other", for: indexPath) as! OtherTableCell
               return cell 
        }
  }

//

, но если возвращаемое значение равно нулю, тогда нет необходимостиоператор внутри cellForRowAt, поскольку он не будет вызываться для другой таблицы

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