UITableView не отображает UITableViewCells - PullRequest
1 голос
/ 06 марта 2020

Я настроил следующий экран в InterfaceBuilder:

enter image description here

Подключено IBOutlets и необходимые функции для соответствия UITableViewDelegate и UITableViewDataSource протоколы. Еще не так много функциональности - просто структура, с которой можно начать. Вот код ViewController:

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var AllCoopsLabel: UILabel!
    @IBOutlet weak var RecentCoopsLabel: UILabel!
    @IBOutlet weak var LatestNotificationsLabel: UILabel!
    @IBOutlet weak var OpenCoops: UILabel!
    @IBOutlet weak var CompletedCoops: UILabel!
    @IBOutlet weak var Earnings: UILabel!
    @IBOutlet weak var OpenCoopsLabel: UILabel!
    @IBOutlet weak var CompletedCoopsLabel: UILabel!
    @IBOutlet weak var EarningsLabel: UILabel!
    @IBOutlet weak var ShowAllCoopsButton: UIButton!
    @IBOutlet weak var ShowAllNotificationsButton: UILabel!
    @IBOutlet weak var RecentCoopsTable: UITableView!
    @IBOutlet weak var LatestNotificationsTable: UITableView!
    let apiService = APIService()
    var parentController: TabBarController?
    var user: User?



    override func viewDidLoad() {
        super.viewDidLoad()
        RecentCoopsTable.dataSource = self
        RecentCoopsTable.delegate = self
        LatestNotificationsTable.dataSource = self
        LatestNotificationsTable.delegate = self

        let token = UserDefaults.standard.string(forKey: "authtoken")!
        self.apiService.getUserFromAuthtoken(token: token, completion: {result in
            switch result {
            case .success(let user):
                DispatchQueue.main.async {
                    self.user = user
                    self.parentController = self.tabBarController as? TabBarController
                    self.parentController?.user = user
                    Globals.shared.user = user
                }
            case .failure(let error):
                print("An error occured \(error.localizedDescription)")
            }
        })
    }



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



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("Was here")
        let coopCell = tableView.dequeueReusableCell(withIdentifier: "RecentCoopsViewCell", for: indexPath) as! CoopViewCell
        coopCell.CoopName.text = "foo bar"
        return coopCell
    }



    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    }



    @IBAction func showAllCooperationsButtonPressed(_ sender: Any) {
        print("showAllCooperationsButtonPressed")
    }



    @IBAction func showAllNotificationsButtonPressed(_ sender: Any) {
        print("showAllNotificationsButtonPressed")
    }
}



class CoopViewCell: UITableViewCell {


    @IBOutlet weak var CoopName: UILabel!

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

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}



class NotificationViewCell: UITableViewCell {

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

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
}

Как я вижу, я должен увидеть 3 строки таблицы с надписью "foo bar". Но я не Просто возьмите это.

enter image description here

Также не получено 3 ожидаемых журналов консоли «Был здесь». Что я пропустил?

Ответы [ 4 ]

2 голосов
/ 06 марта 2020

По данным сайта Apple Developer

Попробуйте перезагрузить tableView после вызова API.

tableView.reloadData()
0 голосов
/ 07 марта 2020

Этот контроллер представления имеет 2 ячейки табличного представления, и обе имеют тот же контроллер представления, что и его делегат. Следовательно, методы numberOfRowsInSection и cellForRowAt должны быть вызваны для обоих табличных представлений. И поэтому он должен печатать "Was here" всего 6 раз, 3 раза для каждого просмотра таблицы. Поскольку это не напечатано, основной подозреваемый кажется, что класс контроллера представления не установлен как HomeViewController. Пожалуйста, попробуйте добавить оператор печати в методе viewDidLoad?

Также принудительное развертывание ячейки в cellForRowAt должно составлять sh в первой ячейке таблицы уведомлений.

0 голосов
/ 07 марта 2020

Проверьте, назначили ли вы идентификатор ячейки и класс для раскадровки. Это должно помочь.

enter image description here

0 голосов
/ 07 марта 2020

Проблема заключалась в том, что я не обработал второе представление таблицы в cellforRowAt. Следующее исправило это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("Was here")
        if(tableView == RecentCoopsTable) {
            let coopCell = tableView.dequeueReusableCell(withIdentifier: "RecentCoopsViewCell", for: indexPath) as! CoopViewCell
            coopCell.CoopName.text = "foo bar"
            return coopCell
        } else if(tableView == LatestNotificationsTable) {
            let coopCell = tableView.dequeueReusableCell(withIdentifier: "LatestNotificationsViewCell", for: indexPath) as! NotificationViewCell
            return coopCell
        }
        else {return UITableViewCell()}
    }

Все еще имел фиксированную высоту tableViews в IB, что не является идеальным. Если у кого-то есть решение для этого, я буду очень признателен.

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