Невозможно загрузить UITableView в Playground - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь добавить UITableView на игровой площадке Swift, но по какой-то причине он не загружается. Вот мой код:

class MyViewController : UIViewController,UITableViewDelegate,UITableViewDataSource {
    let content = ["One", "Two"]
    var tableView = UITableView()

    override func loadView() {
        let view = UIView()
        view.backgroundColor = .red
        self.view = view
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .blue
        self.tableView = UITableView(frame: self.view.bounds, style: .plain)
        self.tableView.delegate      =   self
        self.tableView.dataSource    =   self
        self.view.addSubview(self.tableView)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.content.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        if cell.detailTextLabel == nil {
            cell = UITableViewCell(style: .value1, reuseIdentifier: "cell")
        }
        cell.textLabel?.text = self.content[indexPath.row]
        return cell
    }
}

PlaygroundPage.current.liveView = MyViewController()

Xcode screenshot

Кто-нибудь из вас знает, почему просмотр таблицы не загружается в представлении?

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

Вы должны добавить super.loadView() в override func loadView() внизу и Соответствовать для доступа к суперклассовой версии метода для получения дополнительной информации о функциях super и LoadView, перейдите по этим ссылкам суперкласс и loadView ()

0 голосов
/ 15 мая 2018

Попробуйте напечатать размер self.view.bounds при создании табличного представления на viewDidLoad, я подозреваю, что это будет .zero.

Я попробовал это, и это работает:

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController, UITableViewDataSource {

    let content = ["One", "Two"]

    var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView = UITableView(frame: .zero)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.dataSource = self
        view.addSubview(tableView)

        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.topAnchor),
            tableView.rightAnchor.constraint(equalTo: view.rightAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            tableView.leftAnchor.constraint(equalTo: view.leftAnchor)
            ])
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return content.count
    }

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

        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = content[indexPath.row]
        return cell

    }

}

PlaygroundPage.current.liveView = MyViewController()
0 голосов
/ 15 мая 2018

Причина отсутствия отображаемых ячеек в том, что

  • Вы не зарегистрировали ячейку (как уже упоминалось @kirander)
  • ваш вид таблицы вообще не имеет размера.

Вы не должны делать компоновку / геометрию в viewDidLoad, потому что рамка и границы непредсказуемы во время вызова этого метода.

Вы можете использовать autolayout для подключения табличного представления к измерению внешнего вида или обновить фрейм в viewDidAppear:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = .blue
    print (self.view.bounds)    // (0.0, 0.0, 0.0, 0.0)
    self.tableView = UITableView(frame: self.view.bounds, style: .plain)
    self.tableView.delegate      =   self
    self.tableView.dataSource    =   self
    self.view.addSubview(self.tableView)

    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    super.viewDidLoad()
}

override func viewDidAppear(_ animated: Bool) {
    print (self.view.bounds)    // (0.0, 0.0, 375.0, 668.0)
    self.tableView.frame = self.view.bounds
}

или, при использовании autolayout :

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = .blue
    print (self.view.bounds)    // (0.0, 0.0, 0.0, 0.0)
    self.tableView = UITableView(frame: self.view.bounds, style: .plain)
    self.tableView.delegate      =   self
    self.tableView.dataSource    =   self
    self.view.addSubview(self.tableView)

    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
    tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
    tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
    tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true


    super.viewDidLoad()
}
0 голосов
/ 15 мая 2018

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

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
...