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 文件中视图的大小