尽管已正确初始化,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 视图仍不显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章
iOS 使用自定义 Xib 和视图覆盖 initWithFrame 的正确方法?
没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload
如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置