[英]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)
}
}
我已經檢查了故事板,我已將可重用標識符設置為表格原型單元格,並將數據源和委托屬性連接到表格視圖
並且我在創建 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.