ios swift tableview не показывает пользовательские ячейки - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать табличное представление с пользовательскими ячейками из макета раскадровки в приложении для iOS.

Но по какой-то причине ячейки таблицы не отображаются.Когда я попытался установить точки останова отладки, я обнаружил, что отладчик достигает этой функции

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

, но никогда не достигает этой функции -

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

Вот мой код контроллера представления -

extension NavigationViewController: UITableViewDataSource, UITableViewDelegate, SideMenuControllerDelegate {

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SideMenuTableItem", for: indexPath as IndexPath) as! SideMenuTableItem
        cell.setItemData(items[indexPath.row])
        return cell
    }

    public func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func setupTableViews() {
        menuTable.register(SideMenuTableItem.self, forCellReuseIdentifier: "SideMenuTableItem")

    }
}

class SideMenuTableItem: UITableViewCell {

    @IBOutlet weak var menuImage: UIImageView!
    @IBOutlet weak var menuLabel: UILabel!

    var data: MenuItem?

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

    func setItemData(_ item: MenuItem) {
        data = item
        menuLabel.text = data?.title
        if data?.icon_res != nil {
            menuImage.image = UIImage(named: (data?.icon_res)!)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

Я проверил в раскадровке, что я установил повторно используемый идентификатор для ячейки-прототипа таблицы, а также соединил свойства источника данных и делегата с представлением таблицы

cellidentifier datasource,delegate references other tableview properties debugging results

, и я вызываю метод setupTableViews () внутри моей функции viewDidLoad () после того, каксоздание массива элементов Но я все еще не могу заставить ячейки появляться в моем представлении вообще.Может ли кто-нибудь подсказать, что мне здесь не хватает или что не так с моим кодом, или как я могу дополнительно отладить эту проблему

import UIKit
import SideMenuSwift

class NavigationViewController: UIViewController {

    @IBOutlet weak var navigationContainer: UIView!
    @IBOutlet weak var emailButton: UIButton!
    @IBOutlet weak var phoneButton: UIButton!
    @IBOutlet weak var userAvatar: UIImageView!
    @IBOutlet weak var userProfile: UIButton!
    @IBOutlet weak var userName: UILabel!
    @IBOutlet weak var menuTable: UITableView!

    var service: AuthenticationService!
    var cdc: CoreDataController!
    var items: [MenuItem] = []
    var currentUser: User?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupSidebar()
        initSidebarData()
        setupUserHeader()
        setupTableViews()
    }

    func setupUserHeader() {
        if currentUser != nil {
            if currentUser?.name != nil {
                userName.text = currentUser?.name
            } else if currentUser?.role != nil {
                userName.text = "urTutors " + (currentUser?.role ?? "")
            }
            if currentUser?.avatarUrl != nil {
                userAvatar.downloaded(from: (currentUser?.avatarUrl)!)
            }
        }
    }

    func initSidebarData() {
        service = AuthenticationServiceProvider()
        cdc = CoreDataController()
        items = cdc.getNavigationData()
        currentUser = cdc.getUserData()
    }

    func setupSidebar() {
        self.view.backgroundColor = UIColor.hexColor("#fff")
        navigationContainer.backgroundColor = UIColor.hexColor("#2a2a2a")
        SideMenuController.preferences.basic.statusBarBehavior = .hideOnMenu
        SideMenuController.preferences.basic.position = .above
        SideMenuController.preferences.basic.direction = .left
        SideMenuController.preferences.basic.enablePanGesture = true
        SideMenuController.preferences.basic.menuWidth = 275
        sideMenuController?.delegate = self
    }

    static func createViewController() -> NavigationViewController {
        let sb = UIStoryboard(name: "StudentHomeModuleStoryboard", bundle: nil)
        let vc = sb.instantiateViewController(withIdentifier: "NavigationViewController")
        return vc as! NavigationViewController
    }
}

- ОБНОВЛЕНИЕ -

обновленная функция setupTableLayout -

func setupTableViews() {
        let bundle = Bundle(for: type(of: self))
        let cellNib = UINib(nibName: "SideMenuTableItem", bundle: bundle)
        menuTable.register(cellNib, forCellReuseIdentifier: "SideMenuTableItem")
        menuTable.register(SideMenuTableItem.self, forCellReuseIdentifier: "SideMenuTableItem")
        menuTable.reloadData()
    }

outlets

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Вы никогда не звоните setupTableViews(). Ваш код должен выглядеть так:

class NavigationViewController: UIViewController, SideMenuControllerDelegate {

override func viewDidLoad() {
        super.viewDidLoad()

        setupTableViews()
    }

func setupTableViews() {
menuTable.reloadData()
    }
}

extension NavigationViewController: UITableViewDataSource, UITableViewDelegate {

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

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SideMenuTableItem", for: indexPath as IndexPath) as! SideMenuTableItem
        cell.setItemData(items[indexPath.row])
        return cell
    }

    public func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
}

Вы никогда не вызываете функцию и не вызываете viewDidLoad. Это должно помочь. Кроме того, где находится остальная часть кода контроллера представления (это все? Не должно быть!).

Вам не нужно регистрировать свою ячейку, потому что вы запросили ее и убедитесь, что вы перезагрузили Data ().

Надеюсь, это поможет!

0 голосов
/ 31 марта 2019

После взлома в чате мы обнаружили две проблемы.

Первой проблемой был отсутствующий reloadData звонок, упомянутый выше.Это привело к тому, что cellForRow не был вызван.Добавление reloadData исправило эту проблему, но тогда выходы пользовательского класса ячеек были равны нулю, что привело к сбою в setItemData.

Вторая проблема заключалась в том, что register(_:forCellReuseIdentifier:) вызывался в коде, но пользовательская ячейкабыл уже настроен как часть объявления Interface Builder UITableView.Повторный вызов register для пользовательского класса перерегистрирует reuseIdentifier, отключая розетки, установленные в раскадровке.

Удаление вызова register и добавление reloadData решают все проблемы.

...