为啥我们不遵循使用 xib 创建 customTableViewCell 与使用 xib 创建 customView 相同的过程?
Posted
技术标签:
【中文标题】为啥我们不遵循使用 xib 创建 customTableViewCell 与使用 xib 创建 customView 相同的过程?【英文标题】:Why don't we follow the same process creating customTableViewCell with xib as creating customView with xib?为什么我们不遵循使用 xib 创建 customTableViewCell 与使用 xib 创建 customView 相同的过程? 【发布时间】:2018-02-02 20:54:06 【问题描述】:在创建 customView 时,我们将视图文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。
当我们创建 customUITableViewCell 时,我们将视图的类设置为自定义类,而不是文件的所有者。然后注册所有的笔尖等等。 这样,我们总是需要将 xibs 注册到 UIViewController 和
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
等等。
我发现我不想一直在我想使用 customUITableViewCell 的地方注册 nib。所以我想在我的 customUITableCell 中初始化 xib,就像创建 customUIView 的过程一样。而我成功了。以下是步骤。
我的问题是创建 customUITableCell 的首选方式是什么? 使用此方法无需注册 nib,我们可以在需要的地方调用 customCell 而无需加载/注册 nib。
-
将 xib 的视图文件所有者设置为 customUITableCell 类。不是视图的类设置为 customClass,只是文件的所有者。
Image 1
我的自定义类名为 myView: UITableViewCell
import UIKit
class myView: UITableViewCell
var subView: UIView!
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
initSubviews()
override init(style: UITableViewCellStyle, reuseIdentifier: String?)
super.init(style: style, reuseIdentifier: reuseIdentifier)
initSubviews()
func initSubviews()
subView = Bundle.main.loadNibNamed("TableViewCell", owner: self, options: nil)?.first as! UIView
subView.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleHeight.rawValue)))
self.addSubview(subView)
在 UIVivController 内部,我没有注册 nib 并使用
let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
相反,我这样做了。
let cell = myView(style: .default , reuseIdentifier: "TableViewCell")
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
var tableStyle: UITableView = UITableView()
override func viewDidLoad()
super.viewDidLoad()
tableStyle.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
tableStyle.delegate = self
tableStyle.dataSource = self
view.addSubview(tableStyle)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 100.00
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 1
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = myView(style: .default , reuseIdentifier: "TableViewCell")
return cell
-
这是结果。
Image 4
感谢您的宝贵时间!!!
【问题讨论】:
提示:如果您有代码,请发布代码。不要发布它的屏幕截图。 【参考方案1】:您的方法意味着每次UITableView
请求一个新单元格时,您都是从头开始创建一个全新的单元格。这意味着它必须:
-
找到笔尖
加载笔尖
解析它以找到视图
制作视图
更新单元格
这并不比长滚动视图和自定义视图的整个长度更好。
UITableView
的美妙之处在于它优化了大部分流程并重复使用了单元格,从而大大降低了单元格数量超出屏幕大小的性能成本。 使用传统(正确)方法,步骤 1-4 只需执行一次。
扩展 xib 中的差异:
当使用UITableView
创建单元格时,您只需给它笔尖,系统就会在笔尖中查找UITableViewCell
。一个简单的UIView
是行不通的。
您实际上可以在您的xib
中将UIView
子类化为您的自定义类。碰巧的是,规范是使用fileOwner
,主要是因为这是使用带有UIViewControllers
的笔尖时的规范,这是前故事板时代所要求的
【讨论】:
谢谢。我现在明白其中的区别了。【参考方案2】:对已接受答案的补充:
如果您对“经典”方法的唯一问题是您需要注册 nib 并调用 dequeueReusableCell
,您可以使用 this article 中讨论的良好协议扩展来简化调用:
protocol ReuseIdentifying
static var reuseIdentifier: String get
extension ReuseIdentifying
static var reuseIdentifier: String
return String(describing: Self.self)
extension UITableViewCell: ReuseIdentifying
要注册,只需致电
self.tableView.register(UINib(nibName: MyTableViewCell.reuseIdentifier, bundle: nil), forCellReuseIdentifier: MyTableViewCell. reuseIdentifier)
创建它你调用
let cell = self.tableView.dequeueReusableCell(withIdentifier: MyTableViewCell. reuseIdentifier, for: indexPath) as! MyTableViewCell
(当然这只适用于类、xib 和重用标识符都具有相同名称的情况)
【讨论】:
谢谢。实际上,我对经典方法没有任何问题。我只是对创建自定义 UIView 感到困惑。因为我们将文件的所有者设置为那里的类。不是视图的类到自定义类。但是这里我们将视图的类设置为自定义类,并且这里也不要使用 initWithCoder 或 initSomething 启动。 (这里指的是经典方法) 这个扩展的一个很好的扩展是使用一个名为Reusable的小库。 有趣,谢谢你的链接。我尝试使用尽可能少的框架,特别是如果我可以用几行代码解决问题。但我会试一试。以上是关于为啥我们不遵循使用 xib 创建 customTableViewCell 与使用 xib 创建 customView 相同的过程?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?
php aggiungo una custom taxonomy nella vista sommario di un custom type #backend #taxonomy #customta