ios - ios swift tableview不显示自定义单元格
问题描述
我正在尝试在 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)
}
}
我在情节提要中检查了我已将可重用标识符设置为表格原型单元格,并将数据源和委托属性连接到表格视图
在创建项目数组后,我在 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()
}
解决方案
你从不打电话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()。
希望这可以帮助!
推荐阅读
- javascript - 添加新状态时如何保留以前的状态
- python - 测试逗号分隔的字符串,忽略任何遇到的句点,比如实数?
- c - 如何实现 SWAR 无符号小于?
- php - 将 div 添加到 wordpress 导航中
- java - 来自套接字的 InputStream 和 OutputStream 阻塞
- pytest - 字符串中是否禁止空格作为自定义选项传递给 pytest?
- php - 如何使用 Laravel DB Eloquent with() 并仅获取特定列(Nested Eager Loading Specific Columns)
- java - react-native bridge 位置权限提示两次
- c# - 奥尔良将 RedisGrainStorage 用于“PubSubStore”时会抛出 GrainReferenceNotBoundException
- parallel-processing - 如何控制并发任务数,提高计算速度?