nib 文件未在 viewDidLoad 中注册

Posted

技术标签:

【中文标题】nib 文件未在 viewDidLoad 中注册【英文标题】:nib file not getting registered in viewDidLoad 【发布时间】:2020-09-25 05:27:51 【问题描述】:

我第一次尝试基于笔尖的项目,这是我的步骤和笔尖区域快照

当前错误 - Thread 1: Exception: "invalid nib registered for identifier (Cell) - nib must contain exactly one top level object which must be a UITableViewCell instance"

第 1 步 - 我创建一个名为 HotelNib 的 nib 文件并添加一个 viewCotroller ,创建一个名为 HotelViewController: UIViewController 的类,将其附加到 viewController

第 2 步 - 在 nib 中添加一个 tableView 到 viewController,给它约束

第 3 步 - 转到 SceneDelegate 并添加以下代码,因为我不想加载情节提要,同时从下拉菜单中删除主要内容

guard let winScene = (scene as? UIWindowScene) else  return 
        window = UIWindow(windowScene: winScene)
        guard let homeController = Bundle.main.loadNibNamed("HotelNib", owner: self, options: nil)?.first as? HotelViewController else  return 
        window?.rootViewController = homeController
        window?.makeKeyAndVisible()

第 4 步 - 我运行项目,它运行良好

第 5 步 - 在 nib 区域添加一个tableViewCell,创建一个名为ItemViewCell: UITableViewCell的类

第 6 步 - 添加@IBOutlet weak var tableView: UITableView!,在 HotelView Controller 中,通过 control + 从 tableView 拖动到 viewcontroller 的方式添加委托和数据源

第 7 步 - 在 ItemViewCell 中创建 @IBOutlet weak var nameLabel: UILabel!

第 8 步 - 我在 HotelViewController 中的代码,我无法克服,关于 nib 无法注册的错误接连出现错误,请在此处指导

class HotelViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    
    @IBOutlet weak var tableView: UITableView!
    var restaurantNames = ["Cafe Deadend", "Homei", "Teakha", "Cafe Loisl", "Petite Oyster", "For Kee Restaurant", "Po's Atelier", "Bourke Street Bakery", "Haigh's Chocolate", "Palomino Espresso", "Upstate", "Traif", "Graham Avenue Meats And Deli", "Waffle & Wolf", "Five Leaves", "Cafe Lore", "Confessional", "Barrafina", "Donostia", "Royal Oak", "CASK Pub and Kitchen"]
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        restaurantNames.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ItemViewCell
        cell.nameLabel.text = restaurantNames[indexPath.row]
        return cell
    
    

    override func viewDidLoad() 
        super.viewDidLoad()
        print("right load")
        tableView.delegate = self
        tableView.dataSource = self
        let nib = UINib(nibName: "HotelNib", bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: "Cell") //always fails here
        
        // Do any additional setup after loading the view.
    
    


【问题讨论】:

【参考方案1】:

在单个 .xib 文件中有多个视图也会导致此错误。在单独的 .xib 文件中创建表格视图单元格将解决此错误。

【讨论】:

太棒了

以上是关于nib 文件未在 viewDidLoad 中注册的主要内容,如果未能解决你的问题,请参考以下文章

为自定义 UITableViewCell 加载和注册 nib 时未调用 prepareForSegue

为啥 nib 文件中的 UITableViewCell(加载并添加到堆栈)在 viewDidAppear 中为零,但在 viewDidLoad 中没问题?

IOS UICollectionView 为 UICollectionViewCell 注册 nib 不起作用

UITableViewCell 的 Nib 文件中视图的大小

IBAction 方法未在 viewDidLoad 方法中调用?

Swift iOS SearchController 未在 ViewDidLoad 中调用