簡體   English   中英

ios swift tableview 不顯示自定義單元格

[英]ios swift tableview not showing custom cells

我正在嘗試使用 iOS 應用程序中 Storyboard 布局中的自定義單元格創建表格視圖。

但由於某種原因,表格單元格沒有顯示出來。 當我嘗試設置調試斷點時,我發現調試器正在達到此功能

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)
    }
}

我已經檢查了故事板,我已將可重用標識符設置為表格原型單元格,並將數據源和委托屬性連接到表格視圖

細胞標識符 數據源,委托引用 其他 tableview 屬性 調試結果

並且我在創建 items 數組后在我的 viewDidLoad() 函數中調用 setupTableViews() 方法但是我仍然無法讓單元格出現在我的視圖中。 任何人都可以建議我在這里缺少什么或我的代碼有什么問題,或者我如何進一步調試這個問題

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()
    }

網點

就這個問題闖入聊天后,我們發現有兩個問題。

第一個問題是上面提到的缺少reloadData調用。 這導致cellForRow不被調用。 添加reloadData糾正了該問題,但隨后自定義單元格類的出口為零,導致setItemData崩潰。

第二個問題是在代碼中調用了register(_:forCellReuseIdentifier:) ,但是自定義單元格已經設置為 Interface Builder UITableView聲明的一部分。 在自定義類上再次調用register重新注冊了重用reuseIdentifier ,斷開了故事板中設置的插座。

刪除register調用並添加reloadData解決了所有問題。

您永遠不會調用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。 這應該有幫助。 此外,您的視圖控制器代碼的其余部分在哪里(這就是全部嗎?不應該!)。

您不需要注冊您的單元格,因為您已請求它並確保您 reloadData()。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM