Как мне настроить представление с несколькими табличными представлениями и разными ячейками TableViewCells для каждого табличного представления?

#swift #uitableview #delegates #tableview #datasource

#swift #uitableview #делегаты #tableview #источник данных

Вопрос:

Я пытаюсь создать представление, которое показывает четыре разных tableViews с разными tableViewCells для каждого tableView . Я хотел бы оценить различные tableViewCell классы в cellForRowAt функции, которые я реализовал в my ViewController , но, похоже, это просто не работает.

Я реализовал UITableViewDataSource, UITableViewDelegate как суперклассы и написал delegate and datasource для каждого табличного представления в viewDidLoad .

 import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{   

    //Outlets

    @IBOutlet weak var scheduleView: UIView!
    @IBOutlet weak var scheduleTableView: UITableView!

    @IBOutlet weak var goalsView: UIView!
    @IBOutlet weak var goalsTableView: UITableView!

    @IBOutlet weak var toDoView: UIView!
    @IBOutlet weak var toDoTableView: UITableView!

    @IBOutlet weak var motivationView: UIView!
    @IBOutlet weak var motivationTableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        scheduleView.clipsToBounds = true
        scheduleView.layer.cornerRadius = 15
        goalsView.clipsToBounds = true
        goalsView.layer.cornerRadius = 15
        toDoView.clipsToBounds = true
        toDoView.layer.cornerRadius = 15
        motivationView.clipsToBounds = true
        motivationView.layer.cornerRadius = 15

        // Delegate amp; Datasources
        scheduleTableView.delegate = self
        scheduleTableView.dataSource = self
        goalsTableView.delegate = self
        goalsTableView.dataSource = self
        toDoTableView.delegate = self
        toDoTableView.dataSource = self
        motivationTableView.delegate = self
        motivationTableView.dataSource = self

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

        var realCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath)


        if tableView == scheduleTableView{
            var cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath)
            cell.textLabel?.text = "Text"

        }else if tableView == goalsTableView{
            var cell = tableView.dequeueReusableCell(withIdentifier: "goalsCell", for: indexPath)
            cell.textLabel?.text = "Text"

        }else if tableView == toDoTableView{
            var cell = tableView.dequeueReusableCell(withIdentifier: "toDoCell", for: indexPath)
            cell.textLabel?.text = "Text"


        }else if tableView == motivationTableView{
            var cell = tableView.dequeueReusableCell(withIdentifier: "motivationCell", for: indexPath) as! motivationTableViewCell
            cell.textLabel?.text = "Text"
            cell.motivationImage.image = #imageLiteral(resourceName: "placeholderImage")
            cell.motivationLabel.text = "TestText"

            realCell = cell
        }
        return realCell      
    }
 

Если я запускаю этот код realCell nil
, вместо этого возвращается переменная, она должна возвращать заданные ячейки.

Ответ №1:

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

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == scheduleTableView {
        var cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath)
        cell.textLabel?.text = "Text"

        return cell
    } else if tableView == goalsTableView {
        var cell = tableView.dequeueReusableCell(withIdentifier: "goalsCell", for: indexPath)
        cell.textLabel?.text = "Text"

        return cell
    } else if tableView == toDoTableView {
        var cell = tableView.dequeueReusableCell(withIdentifier: "toDoCell", for: indexPath)
        cell.textLabel?.text = "Text"

        return cell
    } else /*if tableView == motivationTableView*/ {
        var cell = tableView.dequeueReusableCell(withIdentifier: "motivationCell", for: indexPath) as! motivationTableViewCell
        cell.textLabel?.text = "Text"
        cell.motivationImage.image = #imageLiteral(resourceName: "placeholderImage")
        cell.motivationLabel.text = "TestText"

        return cell
    }
}
 

Ответ №2:

Честно говоря, вам вообще не нужна переменная cell . Просто измените cell на realCell и удалите эту строку кода:

 realCell = cell
 

Окончательный код:

 var realCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath)


if tableView == scheduleTableView {
    realCell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath)
    realCell.textLabel?.text = "Text"
} else if tableView == goalsTableView {
    realCell = tableView.dequeueReusableCell(withIdentifier: "goalsCell", for: indexPath)
    realCell.textLabel?.text = "Text"
} else if tableView == toDoTableView {
    realCell = tableView.dequeueReusableCell(withIdentifier: "toDoCell", for: indexPath)
    realCell.textLabel?.text = "Text"
} else if tableView == motivationTableView {
    realCell = tableView.dequeueReusableCell(withIdentifier: "motivationCell", for: indexPath) as! motivationTableViewCell
    realCell.textLabel?.text = "Text"
    realCell.motivationImage.image = #imageLiteral(resourceName: "placeholderImage")
    realCell.motivationLabel.text = "TestText"
}

return realCell