为啥我们不遵循使用 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 相同的过程?的主要内容,如果未能解决你的问题,请参考以下文章

为啥从我的自定义分布中抽取的随机样本不遵循 pdf?

为啥每次都加载新的 xib 文件?为啥不替换前一个?

使用 .xib 创建 CollectionView?

为啥我必须在自定义 NIB / XIB 中连接 IBOutlet 两次?

您可以使用为带有情节提要的 xib 创建的视图控制器吗?

php aggiungo una custom taxonomy nella vista sommario di un custom type #backend #taxonomy #customta