尽管已正确初始化,XIB 视图仍不显示任何内容

Posted

技术标签:

【中文标题】尽管已正确初始化,XIB 视图仍不显示任何内容【英文标题】:XIB view doesn't show anything despite being correctly initialized 【发布时间】:2021-06-09 14:47:40 【问题描述】:

我正在尝试使用 .xib 文件在 TableViewCell 中创建可重用视图。我将所有需要的数据提供给 TableViewCell,它有一个 UIView,它是我的可重用 .xib。我在 UIView 中正确打印了初始化函数,但模拟器屏幕中没有显示任何内容。找不到原因,我现在卡了很长时间。

这是我的 xib 文件:

哪个与我的 UIView 正确关联:

import Kingfisher

class DebateBoxView: UIView 
    @IBOutlet var debateBoxView: UIView!
    @IBOutlet weak var debateBoxImage: UIImageView!
    @IBOutlet weak var debateBoxTitle: UILabel!
    
    var debate: Debate! 
        didSet 
            debateBoxImage.kf.setImage(with: URL(string: debate.imageURL))
            debateBoxTitle.text = debate.name
        
    
    
    override init(frame: CGRect)
        super.init(frame: frame)
        self.commonInit()
    
    
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.commonInit()
    
    
    func commonInit()
        let bundle = Bundle(for: LogoraApp.self) // I'm not using "Bundle.main" because it is a framework.
        bundle.loadNibNamed("DebateBoxView", owner: self, options: nil)
        debateBoxView.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(debateBoxView)
        debateBoxView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
        debateBoxView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
        debateBoxView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
        debateBoxView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    

在我的 tableViewCell 中:

import UIKit

class DebateBox: UITableViewCell 
    @IBOutlet weak var debateBoxView: DebateBoxView!

然后在tableView本身:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = searchResultsTableView.dequeueReusableCell(withIdentifier: "searchDebateBox", for: indexPath) as! DebateBox
        cell.debateBoxView.debate = debateSearchResults[indexPath.row]
        return cell
    

【问题讨论】:

您是否忘记输入 xib 的标识符? 控制台有错误吗? 我在控制台中没有错误。 @stackich 我应该在 xib 哪里放置标识符?我将它与我的 UIView 链接为 xib 的文件所有者并添加了一个出口。 打开xib然后打开属性检查器,你会看到identifier作为第一个字段。 不,只有模拟指标和视图部分。 【参考方案1】:

我遇到了类似的问题...尝试在 viewDidLoad 中注册单元格。

searchResultsTableView.register(UINib(nibName: "DebateBox", bundle: nil), forCellReuseIdentifier: "searchDebateBox")

【讨论】:

【参考方案2】:

我终于找到了解决办法。问题是我对我的 xib 文件的约束不够详细,因此它没有显示在 UI 中。这是我在有人经过时初始化笔尖的代码:

override init(frame: CGRect)
        super.init(frame: frame)
        self.commonInit()
    
    
    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.commonInit()
    
    
    func commonInit()
        let bundle = Bundle(for: Self.self)
        let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
        nib.instantiate(withOwner: self, options: nil)

        addSubview(contentView)
        contentView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: topAnchor),
            contentView.bottomAnchor.constraint(equalTo: bottomAnchor),
            contentView.leadingAnchor.constraint(equalTo: leadingAnchor),
            contentView.trailingAnchor.constraint(equalTo: trailingAnchor)
        ])
    

【讨论】:

以上是关于尽管已正确初始化,XIB 视图仍不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

从 Xib 加载视图在自动布局后调整框架子视图的大小

iOS 使用自定义 Xib 和视图覆盖 initWithFrame 的正确方法?

没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload

初始化 UINavigationItem 的成语

xcode更改视图控制器问题

如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置